ソフトな忘却力(108) PythonのIteratorでフィボナッチ数列する

Joseph Halfmoon

「サイエンティフィック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様のご説明が以下に。geminiIterator

イテレータを実装したオブジェクトを作ってみる

上記の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項までのフィボナッチ数列を求めたところが以下に。fibITER

フィボナッチ数列、もとまっているようです。

また、Spyderの変数イクスプローラをつかって、フィボナッチ数列の第3項を計算したところのオブジェクトの中身を覗き見したところが以下に。fibIClass

まあね、こんなところか(どんなところだ?)

ソフトな忘却力(107) SciPy.ndimage で連結成分解析(CCA)のお勉強 へ戻る

コメントを残す

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