pythonを勉強中 vol.6

オブジェクトの集合のリスト

これもかなり頻繁に使うものだなぁ〜。

Pythonの基礎からで無く、

いきなりDjangoをやっているから

細かい事が解っていないと思うので

これも勉強しておく事にする。

リストとは

オブジェクトを一定の順序で並べたもの

と「初めてのPython」にも書かれている。

つまり左から右へ一定の順序で並べられたオブジェクトの集合。

二次元配列(リストのネスト)も作れる。

例えば通常リストを書くと下記のようになる。

>>> x = [1,2,3]

二次元配列で書く場合は下記になる。

>>> y = [[1,2,3],[4,5,6],[7,8,9]]

ふむふむ。

長さも確認してみる。

>>> len(x)
3

>>> len(y)
3

連結もしてみる。

>>> z = x + y
>>> z
[1, 2, 3, [1, 2, 3], [4, 5, 6], [7, 8, 9]]

今度はインデックス指定

>>> z[0]
1
>>> z[4]
[4, 5, 6]

スライシングで変更してみる。

>>> z[0:4]=’hoge’
>>> z
[‘h’, ‘o’, ‘g’, ‘e’, [4, 5, 6], [7, 8, 9]]
>>> z[0:4]=[‘hoge’,’hige’]
>>> z
[‘hoge’, ‘hige’, ‘hoge’, [7, 8, 9]]

次はソートしてみる。

>>> z.sort()
>>> z
[[7, 8, 9], ‘hige’, ‘hoge’, ‘hoge’]

リストに1つだけオブジェクトを追加する。

>>> z.append(‘more’)
>>> z
[[7, 8, 9], ‘hige’, ‘hoge’, ‘hoge’, ‘more’]

末尾に要素を削除する。

>>> z.pop()
‘more’
>>> z.pop()
‘hoge’

末尾に要素を追加する。

>>> z.extend([1,2,3])
>>> z
[[7, 8, 9], ‘hige’, ‘hoge’, 1, 2, 3]

要素の順書を逆転させる。

>>> z.reverse()
>>> z
[3, 2, 1, ‘hoge’, ‘hige’, [7, 8, 9]]

特定の要素の削除

>>> del z[0]
>>> z
[2, 1, ‘hoge’, ‘hige’, [7, 8, 9]]

こう実際に試しているとPythonっていいなぁ〜って

思えてくる。

組み込みの関数がデフォルト充実しているなぁ〜。

今度はDjangoでは無く、

Pythonでテンプレートエンジンを使って、

何か軽く作ってみたいな。

初めてのPython 第2版
オライリージャパン(2004-11)

  • (著)マーク ルッツ
  • (著)デイビッド アスカー
  • (原著)Mark Lutz
  • (原著)David Ascher
  • (翻訳)夏目 大

オライリージャパン
新品価格:¥ 5,040
中古価格:¥ 4,100
ASIN:4873112109

pythonを勉強中 vol.5

昨日は子供が怪我をしてしまい、

午後8時くらいから看病をしながら、

一緒に寝てました。

本当は寝付いたら、

起きて勉強したりするはずだったのに

起きたら朝6時だったorz

ビックリ!ってか起こしてよ。。。

そんなこんなで、

Pythonを勉強中vol.5

今日は

raise

をやってみる。

こいつの役割は、

初めてのPython」を見てみると

プログラムの中で例外を故意に発生させる場合に使用する

ってな事が書いてある。

書き方が下記の通り

・ raise name
・ raise name, data
・ raise

実際にやってみる。

>>> try:
…   raise IndexError, ‘hoge’
… except IndexError:
…   print ‘index error’
…   raise

index error
Traceback (most recent call last):
File “”, line 2, in
IndexError: hoge

raiseで何も指定しない場合は、

直近(この場合では、raise IndexError, ‘hoge’)の例外を

発生させる事が出来る。

よってexceptブロックで捕まえているが、

そこの例外を処理していないのが解った。

その場合、raise IndexError, ‘hoge’

指定したデータ「hoge」が渡されているのも解った。

なるほどね。

raise」以外にも「assert」も例外を故意に発生させるらしいので、一緒にやってみた。

書き方は下記の通り

assert test, data

これは、「raise」を使用した場合の下記と同じである。

if __debug__:
 if not test:
  raise AssertionError,

ん?
これはつまり if で test がFalseの場合にAssertionErrorって事かな?
なるほど。

こんな感じ

>>> x = 2
>>> assert x < 1, ‘x must be negative’
Traceback (most recent call last):
File “”, line 1, in
AssertionError: x must be negative

AssertionError: x must be negativeになってる。

ほぉ〜。
つまりxは2であり、1よりも大きいため例外処理の対象となっている。

assertは、

プログラマが自ら定めた条件が満たされているかを確かめるためのもの

らしいっす。

まぁ〜確かにタイプミスとかは自動的に検出されるから、

別にassertで例外処理をする必要もないもんね。

初めてのPython 第2版
オライリージャパン(2004-11)

  • (著)マーク ルッツ
  • (著)デイビッド アスカー
  • (原著)Mark Lutz
  • (原著)David Ascher
  • (翻訳)夏目 大

オライリージャパン
新品価格:¥ 5,040
中古価格:¥ 4,100
ASIN:4873112109

Pythonを勉強中 vol.4

いや〜Lingrが繋がらない。。。

さて今日もPythonをやります。

今日は「try catch」です。

みんなのPythonには掲載されていなかったので、

以前yoshukiさんに頂いた「初めてのPython」を参考にしました。

これは例外処理なんかに使われる。

PHPにもありますね。

try、throw、catch

これは4には無く、5から追加された予約語っす。

Pythonでは、

try、except、else、finaly

っすね。

基本は、

try:
 action()
except NameError:
 …..
except TypeError:
 …..
except:
 …..
else:
 …..

こんな感じらしい。
※初めてのPythonから引用っす。

気をつける事は、

elseの解釈と例外名を指定しないexceptですね。

簡単に自分の中で解釈すると、

まずは、例外が発生しなかった場合

1. tryでaction()を実行

2. 例外が発生しないので、elseを実行

次に指定した例外以外の例外が発生した場合

1. tryでaction()を実行

2. exceptを実行

※この場合elseは実行されない

最後にNameErrorが発生した場合

1. tryでaction()を実行

2. except NameErrorを実行

こんな感じかな?

elseはtryブロックの中に書くという方法もあるみたい
こんな感じ

try:
 action()
 # ここへelseの場合の処理を記述
except NameError:
 …..
except TypeError:
 …..
except:
 …..

なるほどなぁ〜。

実際にやってみる。

>>> def type(x, y):
…   print x + y

>>> try:
…    type([0,1,2], “hoge”)
…  except NameError:
…    print “NameError”
…  except TypeError:
…    print “TypeError”
…  else:
…    print “Complete”


TypeError

TypeErrorが発生されたので、
例外名TypeErrorを実行した。

exceptには4つ書き方があるみたい。

・except 例外名:
・except 例外名, value:
・except (例外名, 例外名):
・except (例外名, 例外名), value:

後は、finally
こいつはいわゆる「後処理」に使用されるみたい。

例えば、
ファイルを扱う処理の場合に必ずファイルをクローズするなど。

確かに必要。

このtryでの例外処理と一緒に使用されるのが、raise。

こいつもまた試してみないとなぁ〜。

初めてのPython 第2版
オライリージャパン(2004-11)

  • (著)マーク ルッツ
  • (著)デイビッド アスカー
  • (原著)Mark Lutz
  • (原著)David Ascher
  • (翻訳)夏目 大

オライリージャパン
新品価格:¥ 5,040
中古価格:¥ 4,100
ASIN:4873112109

Pythonを勉強中 vol.3

一日一つやっていこうと思っている、

Python」の勉強のvol.3

今日は、

for」を使って遊んでみる。

実際にどんな動きをするかを確認すると、

おもしろいなぁ~。

>>> x = [‘dog’, ‘cat’, ‘lion’]
>>> y = [‘cow’, ‘pig’, ‘elephant’]
>>> for i in x:
…   i + ‘.jpg’
…  
…  
‘dog.jpg’
‘cat.jpg’
‘lion.jpg’

こんな感じでやってみた。
次に連想配列的なものをやってみる。

>>> k = {}
>>> for i in range(len(x)):
…    for j in range(len(y)):
…     if (i == j):
…      k[i] = x[i], y[j]


>>> k
{0: (‘dog’, ‘cow’), 1: (‘cat’, ‘pig’), 2: (‘lion’, ‘elephant’)}

for i in range(len(x)):よりもfor i, j in enumerate(x):

って書いたほうがオシャレらしい。

実際にやってみた。

>>> h = {}
>>> for i, j in enumerate(x):
…     for k, l in enumerate(y):
…      if i == k:
…       h[i] = j, l


>>> h
{0: (‘dog’, ‘cow’), 1: (‘cat’, ‘pig’), 2: (‘hige’, ‘hoge’)}

おもしろい、おもしろい。

このままやればソースも読めるようになるだろう。

みんなのPython
ソフトバンククリエイティブ(2006-08-22)

  • (著)柴田 淳

ソフトバンククリエイティブ
新品価格:¥ 2,940
中古価格:¥ 1,800
ASIN:479733665X

Pythonを勉強中 vol.2

今日は、

PHPには無い「lambda」を使ってみた。

これはおもしろい。

lambda 引数のリスト : 引数を使った式

がlambdaの書式。

※サンプルのコードは「みんなのPython」から抜粋

実際に試すにあたって、

lambdaを使わない場合が下記

>>> def cmp_len(a, b):
…  return cmp(len(a), len(b))

>>> l = [“123”, “12345”, “12”]
>>> l.sort(cmp_len)
>>> l
[’12’, ‘123’, ‘12345’]

ちゃんとソートされている。

次にlambdaを使ってみる。

>>> l = [“123”, “12345”, “12”]
>>> l.sort(lambda a, b : cmp(a, b))
>>> l
[’12’, ‘123’, ‘12345’]

すげぇ〜1行で書ける。

みんなのPythonには下記の事が書かれていた。

便利だが可読性が悪い

ふむふむ。

ソートのように関数名を添える処理で利用し、
プログラムを簡潔に表記する目的で使われる。

なるほどね。

でもこれ使えたらかなり便利だと思うなぁ〜。

ちなみに今回使った関数で「cmp」というのがある。

これは、

第1引数と第2引数を比較する関数。

第1引数が小さい場合は、「-1」を返す。

両方の引数が等しい場合は「0」を返す。

第1引数の方が大きい場合は、「1」を返す。

ってかあらゆるオブジェクトが比較出来るみたい。

これもいいなぁ〜。

これは初めてのPythonに記述されていたっす。

やってみた。

>>> x = “dog”
>>> y = “lion”
>>> z = “cat”
>>> cmp(x, y)
-1
>>> cmp(y, x)
1
>>> cmp(x, z)
1
>>> cmp(len(x), len(z))
0

こんな感じ。

なるほど。

みんなのPython
ソフトバンククリエイティブ(2006-08-22)

  • (著)柴田 淳

ソフトバンククリエイティブ
新品価格:¥ 2,940
中古価格:¥ 1,800
ASIN:479733665X