この記事では、Pythonのiterableとiteratorの違いについて説明します。
イテレートとイテレータを理解する
Pythonでは、ループや反復処理が可能なものをイテラブルと呼びます。
Pythonの iter() 関数にイテレート可能なオブジェクトを渡すと、イテレータが返されます。
Pythonでは、イテレート可能なオブジェクトを iter() 関数に渡して得られるオブジェクトをイテレータと呼びます。
イテレータは、イテレート可能な値の個数を保持します。
イテレータは、Pythonのリスト、文字列、タプルなどの反復可能なオブジェクトに対して反復処理を行うために使用されます。
イテレータの反復処理では、各要素を1つずつ返します。
注意:Pythonのすべての反復可能なオブジェクトはイテレータではありませんが、すべてのイテレータは反復可能です。
この記事もチェック:Pythonでiter関数を使ったイテレーターの作り方や使い方を解説する
Pythonのイテラブル
Pythonでは、5つのよく知られた反復子オブジェクトがあります。
一つずつ説明しましょう。
1. リスト
リストは、Pythonで最もよく使われる反復可能オブジェクトの1つです。
これはデータ要素を順序付けして保存します。
Pythonのリストを作成し、それを反復処理しましょう。
# Create a Python listlist = ["JournalDev", "Python", "LinuxforDevices"]
print("This is a Python list:")
print(list)
# Iterate through the Python list# using a for loopprint("Iterating a Python list:")
for element in list:
print(element)
|
結果は以下の通りです。
This is a Python list: ['JournalDev', 'Python', 'LinuxforDevices'] Iterating a Python list: JournalDev Python LinuxforDevices |
2. タプル
タプルはPythonでよく使われるもう一つの反復可能なオブジェクトです。
Pythonのリストと同じように、タプルはデータ要素を順番に並べて格納します。
しかし、タプルとリストの唯一の重要な違いは、タプルはPythonのリストが変更可能なオブジェクトであるのに対し、不変のオブジェクトであることです。
Pythonのタプルを作成し、それを反復処理してみましょう。
# Create a Python tupletuple = ('C', 'C++', 'Python', 'Java')
print("This is a Python tuple:")
print(tuple)
# Iterate through the Python tuple# using a for loopprint("Iterating a Python tuple:")
for element in tuple:
print(element)
|
結果は以下の通りです。
This is a Python tuple: ('C', 'C++', 'Python', 'Java') Iterating a Python tuple: C C++ Python Java |
3. 文字列
文字列はPythonで最も頻繁に使用される反復可能オブジェクトの1つです。
シングルクォート、ダブルクォート、トリプルクォートで囲まれたものはすべて、Pythonでは文字列と呼ばれます。
1行の文字列でも複数行の文字列でもかまいません。
Pythonの文字列を作成し、それを反復処理してみましょう。
# Create a Python stringstring = "PYTHON"
print("This is a Python string: " + string)
# Iterate through the Python string# using a for loopprint("Iterating a Python string:")
for element in string:
print(element)
|
出力してみましょう。
This is a Python string: PYTHONIterating a Python string: PY THON |
この記事もチェック:Pythonのシングルクォートとダブルクォートとは?分かりやすく解説する
4. セット
セットもまた、Pythonの非常に有名な反復可能オブジェクトです。
Pythonのリストやタプルに似ていますが、唯一の大きな違いは、セットの中に要素の重複を許さないということです。
それでは、Pythonの集合を作り、それを反復処理してみましょう。
# Create a Python setset = {"Go", "Dart", "Python", "Go"}
print("This is a Python set:")
print(set)
# Iterate through the Python set# using a for loopprint("Iterating a Python set:")
for element in set:
print(element)
|
結果は以下の通りです。
This is a Python set: {'Go', 'Python', 'Dart'} Iterating a Python set: Go Python Dart |
5. 辞書
辞書もまた、Pythonで非常に広く使われている反復可能なオブジェクトです。
キーは単一値でなければならず、対応する値は単一値でも複数値でもかまいませんが、キー:値の形式でデータを格納するために使用されます。
Python辞書を作成し、それを反復してみましょう。
# Create a Python dictionarydict = {'py': 'PYTHON', 'mat': 'MATLAB', 'cpp': 'C++'}
print("This is a Python dictionary:")
print(dict)
# Iterate through the Python dictionary# using a for loopprint("Iterating a Python dictionary:")
for key in dict:
print(key + '-' + dict[key])
|
結果は以下の通りです。
This is a Python dictionary: {'py': 'PYTHON', 'mat': 'MATLAB', 'cpp': 'C++'} Iterating a Python dictionary: py-PYTHON mat-MATLAB cpp-C++ |
Python のイテレータ
Pythonでイテレータクラスのオブジェクトを作成すると、技術的には2つのメソッドがそれに関連付けられます。
この2つのメソッドはイテレータクラスに属し、イテレータプロトコルと総称されます。
方法1: _iter_iter()
Pythonでは、iter()関数にiterableオブジェクトを渡してイテレータオブジェクトを作成しようとすると、自動的に __iter__() メソッドが呼び出されます。
これは、イテレート可能なオブジェクトからイテレータオブジェクトを初期化するために使われます。
このメソッドはリスト、タプル、辞書などのイテレート可能なオブジェクトを反復処理するために使用できるイテレータオブジェクトを返します。
方法2: _next_next()
Pythonでは、イテレート可能なオブジェクトに対して反復処理を行おうとすると、自動的に __next__() メソッドが呼び出されます。
これはイテレータオブジェクトのすべての要素を反復処理するために使用されます。
イテレータに適用されると、イテレート可能なオブジェクトの次の要素または値を返します。
また、__next__() メソッドが返すべきアイテムや要素がイテレート可能オブジェクトに残らない場合、StopIteration Exception を発生させてイテレート可能オブジェクトの反復を停止させるという非常に重要な役割を担っています。
How to convert iterables ➤ iterators?
Python では、リストやタプル、セットなどの反復子オブジェクトを iter() 関数に渡すだけで、簡単にイテレータオブジェクトに変換できます。
イテレータオブジェクトは iter() 関数に渡された反復子オブジェクトに対して __iter__() メソッドを呼び出します。
Python で反復子オブジェクトから反復子オブジェクトを作成し、反復子クラスの __iter__() と __next__() メソッドの働きを解析してみましょう。
# Create an iterable object# here it's a Python listiterable_obj = ['HTML', 'CSS', 'JAVA SCRIPT']
print(type(iterable_obj))
print(iterable_obj)
# Create an iterator object# from the above iterable object (Python list)# using the __iter__() methoditerator_obj = iterable_obj.__iter__()
print(type(iterator_obj))
# Iterate through the iterable object# using its iterator object & the __next__() methodprint(iterator_obj.__next__())
print(iterator_obj.__next__())
print(iterator_obj.__next__())
# Raise the StopIteration Exceptionprint(iterator_obj.__next__())
|
結果は以下の通りです。
# Create an iterable object here it's a Python tupleiterable = ('macOS', 'Linux', 'Windows')
print(type(iterable))
print(iterable)
# Iterate through the iterable object using a for loopprint("Iteration using for loop:")
for item in iterable:
print(item)
# Analyze the implemention of for loop to iterate through the elements of# the iterable object (Python tuple) using an infinite while loop and iterator protocoldef for_loop(iterable):
# Create an iterator object from the passed iterable object
# using the iter() function
iterator = iter(iterable)
# Run an infinite while loop
while True:
try:
# Access the each element of the iterable object
# using the next() function
print(next(iterator))
except StopIteration:
# If the StopIteration Exception is raised
# by the next() function break the while loop
break
# Driver Code to check the implementation of the for_loop() functionprint("Iteration using for_loop function:")
for_loop(iterable) |
上記の Python コードでは、iterable オブジェクト(Python のリスト)を作成し、 _iter__() メソッドを使用して iterator オブジェクトに変換し、iterable オブジェクトの要素に _next__() メソッドを使用してアクセスし、iterable オブジェクトの次の要素にアクセスするために _next__() メソッドが呼ばれたが iterable オブジェクトに要素が残っていない場合に StopIteration Exception を発生させる方法を分析し ています。
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
for ループを使ってイテレート可能なオブジェクトを繰り返し処理する
上記の反復子オブジェクトの例を見てきましたが、Pythonでは反復子オブジェクトの要素を反復するためにforループが広く利用されています。
Pythonのコードを通して、この反復子に対するforループの動作を解析してみましょう。
<class 'tuple'> ('macOS', 'Linux', 'Windows') Iteration using for loop: macOS Linux Windows Iteration using for_loop function: macOS Linux Windows |
結果は以下の通りです。

上記のPythonコードから、反復子オブジェクトの要素を反復するためのforループは、実際には無限whileループで実装されていることがわかりました。
for ループで反復処理する場合、まず iter() 関数を呼び出して反復子オブジェクトを生成し、その中で next() 関数を使用して反復子オブジェクトの次の要素にアクセスし、反復子オブジェクトの要素がなくなったときに next() 関数が StopIteration Exception を発生させて反復処理を停止させます。
まとめ
この記事では、以下のことを学びました。
- Pythonにおけるイテレート可能オブジェクトとイテレータオブジェクトの違い
-
- iterator プロトコル、すなわち iterator クラスの _iter() と _next() メソッド。
-
- IterableオブジェクトからIteratorオブジェクトへの変換
-
- for ループによるイテレート可能なオブジェクトの要素の反復処理