こんにちは,ティロです.
まだまだPython修行中の身で,他人のソースコードを読んでいる際に
1 | def __iter__(self): |
があり,「なんじゃこれ」となったので自分なりに使い方を書き留めておきます.
まず__iter__()はイテレータで要素を反復して取り出すことのできるものらしいです.
こちらの記事に詳しく書いてあります.
サンプルコードを見てください.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class hoge: def __init__(self, name): self._name = name def __iter__(self): yield self._name yield self._name + "1" yield self._name + "2" hoge = hoge("hoge") for i in hoge: print(i) hoge hoge1 hoge2 |
インスタンスをfor文で回すと__iter__のyieldが順に返されます.
yieldは通常の関数のreturn文と同様ですが,サンプルコードのように複数でも大丈夫です.
次に単に値を返すのではなく,ある処理をしてから値を返したい場合は__next__を使用します.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class hoge: def __init__(self, num): self._num = num self._a = 5 def __iter__(self): return self def __next__(self): if self._a > self._num : self._num+=1 return self._num else: raise StopIteration() hoge = hoge(1) for i in hoge: print(i) 2 3 4 5 |
raise stopIteration()は例外処理で,__next__()が呼ばれます.
上のコードではインスタンスでnumに1を指定し,__next__()でself._numが5以上になるまでfor文の繰り返し処理がされます.