今さらPython3 (37) - 標準ライブラリの続きの続き

第5章後半を駆け抜けるつもりが積み残したので続き。

入門 Python 3

入門 Python 3

itertools

これは初めましてという感じ。とりあえず試す。

>>> import itertools
>>> for item in itertools.chain([1,2], ['a','b']):
...     print(item)
... 
1
2
a
b

上の例だと、2つのセット[1,2],['a','b']があたかも1つのセットのように振る舞って、各要素を順番に1つずつ返しているんだね。

>>> for item in itertools.chain([1,2],('a','b')):
...    print(item)
... 
1
2
a
b
>>> 

リスト+リストだけじゃなくて、リスト+タプルみたいのでも行けるみたい。

>>> for item in itertools.chain([1,2],('a','b'),{'x', 'y', 'z'}):
...    print(item)
... 
1
2
a
b
z
y
x
>>> for item in itertools.chain([1,2],('a','b'),{'x':'X', 'y':'Y'}):
...    print(item)
... 
1
2
a
b
y
x
>>> for item in itertools.chain([1,2],('a','b'),{'x':'X', 'y':'Y'}.values()):
...    print(item)
... 
1
2
a
b
Y
X

リスト、タプル、セット、辞書とかの混合でも行けるね。ちょっと遊びすぎたので次へ。

>>> for item in itertools.cycle([1,2]):
...     print(item)
... 

無限ループ生成ですね。Ctrl+Cで止めましょう。

>>> count = 100
>>> for item in itertools.cycle([1,2]):
...     print(item)
...     count -= 1
...     if count == 0:
...        break
... 
1
2
1
.......

breakと併用しようね。

>>> import itertools
>>> for item in itertools.accumulate([1,2,3,4]):
...     print(item)
... 
1
3
6
10

accumulateは第2引数を持たない場合は単に足し算をしてくれ、

>>> def multiply(a,b):
...     return a * b
... 
>>> for item in itertools.accumulate([1,2,3,4], multiply):
...     print(item)
... 
1
2
6
24
>>> 

こんな感じで関数を割り当てて実行することも可能。itertoolsは、順列、組み合わせの関数を多く持っているとのこと。ということで、ドキュメントも読んでおけと。

10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.4.3 ドキュメント

そろそろ、イテレータという単語を自分のボキャの中に入れておかないということでリンクを貼っておく。

イテレータ - Wikipedia

でも、この本の日本語訳においては、配列という単語と置き換えても良いような気もするけど。

pprint()

>>> from pprint import pprint
>>> quotes = OrderedDict([
...     ('Moe', 'A wise guy, huh?'),
...     ('Larry', 'Ow!'),
...     ('Curly', 'Nyuk, Nyuk!'),
... ])
>>> print(quotes)
OrderedDict([('Moe', 'A wise guy, huh?'), ('Larry', 'Ow!'), ('Curly', 'Nyuk, Nyuk!')])
>>> pprint(quotes)
{'Moe': 'A wise guy, huh?',
 'Larry': 'Ow!',
 'Curly': 'Nyuk, Nyuk!'}
>>> 

良い感じで揃えてprintしてくれるという感じだね。

(つづく)