PythonのIterableとIteratorの違いとは何か?分かりやすく解説する

スポンサーリンク

この記事では、Pythonのiterableとiteratorの違いについて説明します。


スポンサーリンク

イテレートとイテレータを理解する

Pythonでは、ループや反復処理が可能なものをイテラブルと呼びます。

Pythonの iter() 関数にイテレート可能なオブジェクトを渡すと、イテレータが返されます。

Pythonでは、イテレート可能なオブジェクトを iter() 関数に渡して得られるオブジェクトをイテレータと呼びます。

イテレータは、イテレート可能な値の個数を保持します。

イテレータは、Pythonのリスト、文字列、タプルなどの反復可能なオブジェクトに対して反復処理を行うために使用されます。

イテレータの反復処理では、各要素を1つずつ返します。

注意:Pythonのすべての反復可能なオブジェクトはイテレータではありませんが、すべてのイテレータは反復可能です。

Pythonのイテラブル

Pythonでは、5つのよく知られた反復子オブジェクトがあります。

一つずつ説明しましょう。

1. リスト

リストは、Pythonで最もよく使われる反復可能オブジェクトの1つです。

これはデータ要素を順序付けして保存します。

Pythonのリストを作成し、それを反復処理しましょう。

# Create a Python list
list = ["JournalDev", "Python", "LinuxforDevices"]
print("This is a Python list:")
print(list)
 
# Iterate through the Python list
# using a for loop
print("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 tuple
tuple = ('C', 'C++', 'Python', 'Java')
print("This is a Python tuple:")
print(tuple)
 
# Iterate through the Python tuple
# using a for loop
print("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 string
string = "PYTHON"
print("This is a Python string: " + string)
 
# Iterate through the Python string
# using a for loop
print("Iterating a Python string:")
for element in string:
    print(element)

出力してみましょう。

This is a Python string: PYTHON
Iterating a Python string:
P
Y
T
H
O
N

4. セット

セットもまた、Pythonの非常に有名な反復可能オブジェクトです。

Pythonのリストやタプルに似ていますが、唯一の大きな違いは、セットの中に要素の重複を許さないということです。

それでは、Pythonの集合を作り、それを反復処理してみましょう。

# Create a Python set
set = {"Go", "Dart", "Python", "Go"}
print("This is a Python set:")
print(set)
 
# Iterate through the Python set
# using a for loop
print("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 dictionary
dict = {'py': 'PYTHON', 'mat': 'MATLAB', 'cpp': 'C++'}
print("This is a Python dictionary:")
print(dict)
 
# Iterate through the Python dictionary
# using a for loop
print("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 list
iterable_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__() method
iterator_obj = iterable_obj.__iter__()
print(type(iterator_obj))
 
# Iterate through the iterable object
# using its iterator object & the __next__() method
print(iterator_obj.__next__())
print(iterator_obj.__next__())
print(iterator_obj.__next__())
 
# Raise the StopIteration Exception
print(iterator_obj.__next__())

結果は以下の通りです。

# Create an iterable object here it's a Python tuple
iterable = ('macOS', 'Linux', 'Windows')
print(type(iterable))
print(iterable)
 
# Iterate through the iterable object using a for loop
print("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 protocol
def 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() function
print("Iteration using for_loop function:")
for_loop(iterable)

上記の Python コードでは、iterable オブジェクト(Python のリスト)を作成し、 _iter__() メソッドを使用して iterator オブジェクトに変換し、iterable オブジェクトの要素に _next__() メソッドを使用してアクセスし、iterable オブジェクトの次の要素にアクセスするために _next__() メソッドが呼ばれたが iterable オブジェクトに要素が残っていない場合に StopIteration Exception を発生させる方法を分析し ています。

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

結果は以下の通りです。

Output Iterator Object Creation
Output: iterator object creation

上記のPythonコードから、反復子オブジェクトの要素を反復するためのforループは、実際には無限whileループで実装されていることがわかりました。

for ループで反復処理する場合、まず iter() 関数を呼び出して反復子オブジェクトを生成し、その中で next() 関数を使用して反復子オブジェクトの次の要素にアクセスし、反復子オブジェクトの要素がなくなったときに next() 関数が StopIteration Exception を発生させて反復処理を停止させます。

まとめ

この記事では、以下のことを学びました。

  1. Pythonにおけるイテレート可能オブジェクトとイテレータオブジェクトの違い
    1. iterator プロトコル、すなわち iterator クラスの _iter() と _next() メソッド。
    1. IterableオブジェクトからIteratorオブジェクトへの変換
    1. for ループによるイテレート可能なオブジェクトの要素の反復処理
タイトルとURLをコピーしました