
「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lecturesの実習中。前回はCCAでした。今回は新単元?第7章に入ります。再びPythonそのものの練習に戻って、イテレータです。いつも利用させていただいているイテレータですが、今回はイテレータを作るところね。
※「 ソフトな忘却力」投稿順 Index はこちら
※Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でも老い先短い年寄には量が多過ぎて多分死ぬまでに終わりません。適当な練習でお茶を濁してます。今回は「7. Advanced Python Constructs」の「7.1.1 Iterators」です。
イテレータ
普段からイテレータにはお世話になりっぱなしです。ただ明示的にIteratorだと意識して書いていないだけで、ループなど使う場合は知らず知らずにお世話になってます。念のため、Googleの生成AI、Gemini 2.5 Flash様のご説明が以下に。
イテレータを実装したオブジェクトを作ってみる
上記のGemini様のご説明にあるように、Pythonのリストとかタプルとか多くの組み込み型はイテレータオブジェクトを取得可能なようにあらかじめできているので、ことさらにイテレータを実装しないでも事足りることが多いです。 でもま、練習ということで、今回はフィボナッチ数列をイテレータで求めるクラスを自前実装してみました。こんな感じ。ちょっと最初の2項のところが汚い感じがするんだが。。。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thr Jul 17 2025
@author: jhalfmoon
Fibonacci sequence iterator
"""
class FibIter(object):
def __init__(self):
self.Fn = 1
self.Fn1 = 1
self.i = 1
def __iter__(self):
return self
def __next__(self):
if self.i == 1:
self.i += 1
return self.Fn
if self.i == 2:
self.i += 1
return self.Fn1
Fn2 = self.Fn1 + self.Fn
self.Fn = self.Fn1
self.Fn1 = Fn2
return Fn2
def main():
fibObj = FibIter()
for idx in range(1, 10):
print("F{0}: {1}".format(idx, next(fibObj)))
if __name__ == '__main__':
main()
FibIterオブジェクトを使ってみる
上記のスクリプトを動かして、第1項から第9項までのフィボナッチ数列を求めたところが以下に。
フィボナッチ数列、もとまっているようです。
また、Spyderの変数イクスプローラをつかって、フィボナッチ数列の第3項を計算したところのオブジェクトの中身を覗き見したところが以下に。
まあね、こんなところか(どんなところだ?)