0
1

Python イテレータとイテラブルの違いを理解する

Last updated at Posted at 2024-08-28

前提条件

この記事は、Python 3.6以降のバージョンを対象としています。ほとんどの概念は以前のバージョンでも適用されますが、一部の機能や構文は新しいバージョンで導入されたものがあります。

記事の概要

Pythonプログラミングにおいて、イテレータとイテラブルは非常に重要な概念です。これらの概念を理解することで、より効率的で柔軟なコードを書くことができます。本記事では、初級者から中級者まで幅広い読者を対象に、イテレータとイテラブルの違いを解説し、それぞれの特徴と使用方法を明確にします。

image.png

イテラブルとは

イテラブル(iterable)は、繰り返し可能なオブジェクトのことを指します。簡単に言えば、for文で反復処理できるオブジェクトです。

主なイテラブルの例:

  • リスト(list)
  • タプル(tuple)
  • 文字列(str)
  • 辞書(dict)
  • 集合(set)
  • ファイルオブジェクト

イテラブルは、__iter__() メソッドを実装しているオブジェクトです。このメソッドはイテレータを返します。

イテレータとは

イテレータ(iterator)は、データの流れを表現するオブジェクトです。イテレータは以下の2つのメソッドを実装しています:

  1. __iter__(): 自分自身(イテレータ)を返します。
  2. __next__(): 次の要素を返します。要素がない場合は StopIteration 例外を発生させます。

イテレータの主な特徴:

  • 一度に1つの要素を返す
  • 状態を保持する(現在の位置を覚えている)
  • 全ての要素を走査したら終了する

サンプルコード

以下に、イテレータとイテラブルの違いを示すサンプルコードを提供します。

# イテラブルの例
my_list = [1, 2, 3, 4, 5]  # リストはイテラブル

# イテレータの例
my_iterator = iter(my_list)  # iter()関数でイテラブルからイテレータを作成

# イテラブルの使用
print("イテラブルの使用:")
for item in my_list:
    print(item, end=' ')
print("\n")

# イテレータの使用
print("イテレータの使用:")
print(next(my_iterator))  # 1
print(next(my_iterator))  # 2
print(next(my_iterator))  # 3

# カスタムイテレータの作成
class CountDown:
    def __init__(self, start):
        self.start = start

    def __iter__(self):
        return self

    def __next__(self):
        if self.start <= 0:
            raise StopIteration
        self.start -= 1
        return self.start + 1

# カスタムイテレータの使用
print("\nカスタムイテレータの使用:")
for num in CountDown(5):
    print(num, end=' ')

実行例

上記のコードを実行すると、以下のような出力が得られます:

イテラブルの使用:
1 2 3 4 5 

イテレータの使用:
1
2
3

カスタムイテレータの使用:
5 4 3 2 1 

イテラブルとイテレータの違い

  1. メモリ使用: イテラブルは通常、すべての要素をメモリに保持しますが、イテレータは現在の状態のみを保持します。
  2. アクセス方法: イテラブルは添字でアクセスできることがありますが(例:リスト)、イテレータは next() 関数でのみアクセスします。
  3. 再利用: イテラブルは何度でも反復できますが、イテレータは一度走査すると再利用できません。

ジェネレータ - イテレータの特殊な形

ジェネレータは、イテレータを簡単に作成する方法です。yield キーワードを使用して定義します。

def countdown_generator(start):
    while start > 0:
        yield start
        start -= 1

# ジェネレータの使用
for num in countdown_generator(5):
    print(num, end=' ')  # 出力: 5 4 3 2 1

ジェネレータは、大量のデータを扱う際にメモリ効率が良いため、中級者以上のプログラマーにとって非常に有用なツールです。

公式の参考情報

Pythonの公式ドキュメントでは、イテレータとイテラブルについて詳しく説明されています:

まとめ

image.png

  1. イテラブルは、繰り返し可能なオブジェクト(例:リスト、タプル、文字列)です。
  2. イテレータは、__next__() メソッドを持ち、要素を一つずつ返すオブジェクトです。
  3. iter() 関数を使ってイテラブルからイテレータを作成できます。
  4. カスタムイテレータを作成することで、独自の反復処理を実装できます。
  5. ジェネレータは、イテレータを簡単に作成する方法で、メモリ効率が良いです。
  6. イテレータとイテラブルを理解することで、より効率的なPythonコードを書くことができます。

初級者の方は、基本的なイテラブルの使用方法とイテレータの概念を理解することから始めてください。中級者の方は、カスタムイテレータの作成やジェネレータの活用にチャレンジしてみてください。イテレータとイテラブルの概念を深く理解することで、Pythonプログラミングのスキルを大きく向上させることができます。

参考記事

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1