ソフトな忘却力(110) Pythonのitertools、ちょこっと自主練習

Joseph Halfmoon

「サイエンティフィック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)

上記を実行すれば、その結果は以下のようです。simpleCount

上記のような浮動小数の等差数列が得られました。そんなこと range()関数でもできるじゃん、と思ってみたらば、rangeできるのは整数でしたな。おっと。

    • islice

上記countは「無限イテレータ」を得るものでした。それで打ち切り条件が必要でした。しかしitertoolsには「無限イテレータ」から「有限なスライス」を切り出すお道具も存在します。

slice10 = [x for x in it.islice(it.count(1, 0.5), 10)]

上記は先ほどの無限イテレータの最初の10項を取り出す「リスト内包」っす。実行結果をSpyderの変数ブラウザでみるとこんな感じ。slice10

もちろん、最初からだけでなく、途中から取り出す指定も可能デス。

    • zipと組み合わせてどうよ。

また、enumerate風のインデックス付のタプルにするとかもzipと組み合わせれば簡単デス。

tpl10 = [tpl for tpl in zip(it.count(1), slice10)]

結果が以下に。tpl10

    • cycle

今度は、同じ値が何度も繰り返されるようなシーケンスの生成。

cyc7 = [x for x in it.islice(it.cycle([1, 7, 11]), 7)]

その結果。cyc7

 

    • accumulate

生成した数列の各項までを順次積算した数列を返すなんてこともできる。

acc7 = [x for x in it.accumulate(cyc7)]

この結果が以下に。acc7

    • filterfalse

さらに得た数列の各項に条件をつけて抽出したりもできる。

a1 = [x for x in it.filterfalse(lambda x: x%2==1 , acc7)]

結果が以下に。a1

やっていて飽きないitertoolsっす。無限に数列やら級数と戯れられる?ホントか?

ソフトな忘却力(109) PythonのGeneratorで「わざわざ」ポアソン分布乱数 へ戻る

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です