2012年6月13日水曜日

初めてのPython20章 その2

とりあえず20章のつづき。

まずはzip関数とシーケンスを分解してタプルで返す
>>> zip([-2, -1, 0])
[(-2,), (-1,), (0,)]
>>>
>>> zip([-2, -1, 0], [3, 2, 1, 0])
[(-2, 3), (-1, 2), (0, 1)]



関数に複数の引数を与え、それをzip関数で解凍する
>>> def mymap(func, *seqs):
...     return [func(*args) for args in zip(*seqs)]
zip関数を自作すると以下のようになる。
while all(seqs)に注目
>>> def myzip(*seqs):
...     seqs = [list(S) for S in seqs]                #各引数をリストに直したものをseqsに入れる
...     res = []
...     while all(seqs):                              #各引数について先頭のものを消去しながらループ
...         res.append(tuple(S.pop(0) for S in seqs))
...     return res
... 
>>> myzip([1,2,3])
[(1,), (2,), (3,)]

ここでallはリスト内の各要素が反復可能か調べるみたい
anyとかいうのもある。
>>> all([1,2,3])
True
>>> all([1,2,0])
False
>>> all([[1,2], [0]])
True
>>> all([[1,2], []])
False
>>> all([])
True

dictionaryの反復はkeyでアクセスする。
>>> d = {'jap': 35, 'ame': 2, 'eng': 0}
>>> for key in d:
...     print key, d[key]
...     
ame 2
jap 35
eng 0
>>> 

リストをfor文で作れるがセットでは違ってくる(重複するのを避ける)
>>> [x + y for x in [1,2,3] for y in [4, 5, 6]]
[5, 6, 7, 6, 7, 8, 7, 8, 9]
>>> {x + y for x in [1,2,3] for y in [4,5,6]}
set([5, 6, 7, 8, 9])


0 件のコメント:

コメントを投稿