
「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。前回はジェネレータ(Generator)でした。先走って yield してしまいました。今回はレクチャでは「分かっているよね」的な扱いに思える、itertoolsを自主練習です。
※「 ソフトな忘却力」投稿順 Index はこちら
※Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でも老い先短い年寄には量が多過ぎて多分死ぬまでに終わりません。適当な練習でお茶を濁してます。今回は「7. Advanced Python Constructs」の「7.1.3 Generator」の順番ですが、前回先走って yield してしまったので、自主練習回です。
itertools
みんな大好き itertools の解説ページが以下に。
https://docs.python.org/ja/3.13/library/itertools.html
「イテレータ部品」をこれでもかと集めているモジュールっす。代表的?なところでこんな感じ。
-
- count
import itertools as it for x in it.count(1, 0.5): if x > 3.0: break print(x)
上記のような浮動小数の等差数列が得られました。そんなこと range()関数でもできるじゃん、と思ってみたらば、rangeできるのは整数でしたな。おっと。
-
- islice
上記countは「無限イテレータ」を得るものでした。それで打ち切り条件が必要でした。しかしitertoolsには「無限イテレータ」から「有限なスライス」を切り出すお道具も存在します。
slice10 = [x for x in it.islice(it.count(1, 0.5), 10)]
上記は先ほどの無限イテレータの最初の10項を取り出す「リスト内包」っす。実行結果をSpyderの変数ブラウザでみるとこんな感じ。
もちろん、最初からだけでなく、途中から取り出す指定も可能デス。
-
- zipと組み合わせてどうよ。
また、enumerate風のインデックス付のタプルにするとかもzipと組み合わせれば簡単デス。
tpl10 = [tpl for tpl in zip(it.count(1), slice10)]
-
- cycle
今度は、同じ値が何度も繰り返されるようなシーケンスの生成。
cyc7 = [x for x in it.islice(it.cycle([1, 7, 11]), 7)]
-
- accumulate
生成した数列の各項までを順次積算した数列を返すなんてこともできる。
acc7 = [x for x in it.accumulate(cyc7)]
-
- filterfalse
さらに得た数列の各項に条件をつけて抽出したりもできる。
a1 = [x for x in it.filterfalse(lambda x: x%2==1 , acc7)]
やっていて飽きないitertoolsっす。無限に数列やら級数と戯れられる?ホントか?