Python 3のイテレータ(iterator)とジェネレータ(generator)

イテレータ

イテレータはPythonの最も強力な機能の1つであり、コレクション要素にアクセスする方法の1つです。

イテレータは、値に含まれている要素を 1 個ずつ「繰り返し」取り出せるオブジェクトのことです。取り出す位置を記憶できます。

イテレータオブジェクトは、集合の最初の要素から、すべての要素にアクセスされるまでアクセスします。 イテレータは前進することしかできず、後退することはできません。

イテレータには、iter()とnext()の2つの基本的なメソッドがあります。

文字列、リスト、辞書、またはタプルはすべて、イテレータの作成に使用できます。

実例(Python 3.0以降)

>>> list=[1,2,3,4]
>>> it = iter(list)    # イテレータオブジェクトを作成する。
>>> print (next(it))   # イテレータの次の要素を出力する。
1
>>> print (next(it))
2
>>> 

イテレータオブジェクトは、通常のforステートメントを使用してトラバースできます。

実例(Python 3.0以降)

#!/usr/bin/python3 

list=[1,2,3,4] 
it = iter(list)    #イテレータオブジェクトを作成する。 
for x in it: 
    print (x, end=" ")

上記のプログラムを実行すると、出力結果は次のようになります。

1 2 3 4

next()関数を使用することもできます。

実例(Python 3.0以降)

#!/usr/bin/python3
 
import sys   # sysモジュールをインポートする。
list=[1,2,3,4] 
it = iter(list)  # イテレータオブジェクトを作成する。 

while True: 
    try: 
        print (next(it)) 
    except StopIteration: 
        sys.exit()

上記のプログラムを実行すると、出力結果は次のようになります。

1
2
3
4

イテレータを作成する

クラスをイテレータとして使用するには、クラスに_iter_ ()と_next_ ()の2つのメソッドを実装する必要があります。

オブジェクト指向プログラミングをすでに知っている場合は、クラスにコンストラクターがあることを知っているはずです。Pythonのコンストラクターはinit ()であり、オブジェクトが初期化されるときに実行されます。

_iter_ ()メソッドは、特殊なイテレータオブジェクトを返します。このイテレータオブジェクトは_ next _()メソッドを実装し、StopIteration例外を使用してイテレーションの完了を識別します。

_next_ ()メソッド(Python 2にはnext()である)は、次のイテレータオブジェクトを返します。

数値を返すイテレータを作成します。初期値が1で、1ずつ増加します。

実例(Python 3.0以降)

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

実行出力は次のとおりです。

1
2
3
4
5

StopIteration

StopIteration例外は、イテレーションの完了を識別し、無限ループを防ぐために使用されます。next ()メソッドでは、指定された数のループが完了した後にStopIteration例外がトリガーされるように設定して、イテレーションを終了させます。

20回のイテレーション後に実行を停止します。

実例(Python 3.0以降)

class MyNumbers: 
    def __iter__(self): 
        self.a = 1 
        return self 
    
    def __next__(self): 
        if self.a <= 20: 
            x = self.a 
            self.a += 1 
            return x 
        else: raise StopIteration 

myclass = MyNumbers() 
myiter = iter(myclass) 

for x in myiter: 
    print(x)

実行した出力結果は次のとおりです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

ジェネレータ

Pythonでは、yieldを使用する関数はジェネレータ(generator)と呼ばれています。

通常の関数とは異なり、ジェネレータはイテレータを返す関数であり、イテレーション操作にのみ使用できます。ジェネレータがイテレータの一種であることを理解する方が簡単です。

ジェネレータを呼び出して実行するプロセスでは、関数は、yieldに遭遇するたびに現在実行中のすべての情報を一時停止して保存し、yieldの値を返します。next()メソッドが次に実行されるときに現在の位置から実行を継続します。

ジェネレータ関数を呼び出すと、イテレータオブジェクトが返されます。

次の例では、yieldを使用してフィボナッチ数列を実行します。


#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # ジェネレータ関数-フィボナッチ
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # fはイテレータであり、ジェネレータによって返される。
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

上記のプログラムを実行すると、出力結果は次のようになります。

0 1 1 2 3 5 8 13 21 34 55
Share

コメントを残す

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