pythonのitertoolsはかなり便利っぽい
pythonで無限ループを書きたいときに
i = 0 while True: something(i) i+=1
とか書いてませんか? 私は書いてました。 聞くところによると、itertoolsというライブラリがあるそうです。 このライブラリを使うとさっきのコードが
for i in itertools.count(): something(i)
こんなに簡単になる。うわお。
他にも便利なイテレータがたくさん定義されていて、たとえば複数のイテレータを繋いだり。
>>> a = range(0, 5) >>> b = range(10, 15) >>> tuple(itertools.chain(a, b)) (0, 1, 2, 3, 4, 10, 11, 12, 13, 14)
0-4までと10-14までの二つのrangeを繋いでみた。
入れ子になったfor文をまとめてくれるやつがあったり。
>>> for i in range(3): ... for c in 'AB': ... print('{0}: {1}'.format(i, c)) ... 0: A 0: B 1: A 1: B 2: A 2: B >>> for i, c in itertools.product(range(3), 'AB'): ... print('{0}: {1}'.format(i, c)) ... 0: A 0: B 1: A 1: B 2: A 2: B
一行減っただけだけれど、for文ってかなり効率悪いらしいから、処理速度はかなり早くなっている、はず?
組み合わせを生成してくれるやつとか
>>> for x in itertools.combinations('ABCD', 2): ... print(''.join(x)) ... AB AC AD BC BD CD >>> for x in itertools.combinations('ABCD', 3): ... print(''.join(x)) ... ABC ABD ACD BCD
xがtupleになっているのでjoinして表示してます。パスワードの総当たりとかやりやすくなって素敵だね?
他にもhaskellのdropWhileとかtakeWhileみたいなやつとか。
>>> tuple(range(10)) (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) >>> itertools.dropwhile(lambda x: x<5, range(10)) (5, 6, 7, 8, 9) >>> itertools.takewhile(lambda x: x<5, range(10)) (0, 1, 2, 3, 4)
lambdaで作って渡している関数がTrueを返す間データを返すorデータを捨てる、という挙動。
その他諸々、たくさんあります。全部書くと大変なので、とくに便利そうなやつだけ。 こういうの使いこなすと絶対楽にコード書けるよねー。勉強しよう・・・。
参考: 10.1. itertools — 効率的なループ実行のためのイテレータ生成関数 — Python 3.4.3 ドキュメント