イテレータとジェネレータ | コレクションとデータ構造 | JavaScriptプログラマのためのPython入門

スポンサーリンク
スポンサーリンク

イテレータとジェネレータ

この記事では、PythonとJavaScriptにおけるイテレータとジェネレータの違いについて、JavaScriptプログラマ向けに解説します。両言語での実装や使い方に違いがありますが、それぞれの仕組みを理解することで、より柔軟で効率的な反復処理を実現できます。

イテレータとは

イテレータは、反復処理を行うためのオブジェクトです。PythonとJavaScriptの両方で、next()メソッドを使って次の要素にアクセスできます。イテレータは状態を保持し、次に何が返されるかを追跡します。

Pythonのイテレータの例

# Pythonのイテレータ
fruits = ["apple", "banana", "cherry"]
iterator = iter(fruits)
print(next(iterator))  # apple
print(next(iterator))  # banana

Pythonでは、iter()関数でリストなどの反復可能なオブジェクトをイテレータに変換し、next()で次の要素を取得できます。

JavaScriptのイテレータの例

// JavaScriptのイテレータ
const fruits = ["apple", "banana", "cherry"];
const iterator = fruits[Symbol.iterator]();
console.log(iterator.next().value);  // apple
console.log(iterator.next().value);  // banana

JavaScriptでは、Symbol.iteratorを使ってイテレータを取得し、同様にnext()で次の要素を取得します。

ジェネレータとは

ジェネレータは、イテレータを生成する特別な関数で、通常の関数とは異なり、一度にすべての要素を返すのではなく、yieldキーワードを使って必要な時に値を一つずつ返します。PythonとJavaScriptの両方でジェネレータを使って効率的にデータを扱うことができます。

Pythonのジェネレータの例

# Pythonのジェネレータ
def count_up(limit):
    num = 0
    while num < limit:
        yield num
        num += 1

counter = count_up(3)
print(next(counter))  # 0
print(next(counter))  # 1
print(next(counter))  # 2

Pythonではyieldを使ってジェネレータを作成し、next()で次の値を逐次返します。

JavaScriptのジェネレータの例

// JavaScriptのジェネレータ
function* countUp(limit) {
    let num = 0;
    while (num < limit) {
        yield num++;
    }
}

const counter = countUp(3);
console.log(counter.next().value);  // 0
console.log(counter.next().value);  // 1
console.log(counter.next().value);  // 2

JavaScriptでもfunction*を使ってジェネレータ関数を定義し、yieldで値を返します。

PythonとJavaScriptのイテレータとジェネレータの比較表

特徴 Python JavaScript
イテレータの作成 iter()で作成 Symbol.iteratorで作成
ジェネレータの作成 yieldを使用 function*yieldを使用
次の要素の取得 next()で次の要素を取得 next()で次の要素を取得

ステップバイステップで理解する

  1. まず、PythonとJavaScriptのイテレータの基本的な使い方を理解します。
  2. 次に、ジェネレータの概念を学び、yieldを使ってデータを効率的に返す方法を実践します。
  3. それぞれの言語でイテレータとジェネレータの使いどころを学び、実践的な用途で活用します。

まとめ

この記事では、PythonとJavaScriptにおけるイテレータとジェネレータの仕組みを比較しました。両言語での実装方法や使い方にいくつかの違いがありますが、共通するのは、イテレータとジェネレータが反復処理を効率的に行うための強力なツールであることです。特にジェネレータは、メモリの効率を向上させるために非常に有用です。