Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ Pythonにおけるイテレータの理解 | Pythonにおけるイテレータとジェネレータの習得
Python構造化プログラミング
セクション 6.  2
single

single

bookPythonにおけるイテレータの理解

メニューを表示するにはスワイプしてください

イテレータとは何か

技術的には、Pythonにおけるイテレータは、イテレータプロトコルを実装するオブジェクトであり、次のメソッドで構成されます。

  • __iter__(): イテレータオブジェクト自身を返し、forのようなループで利用可能にする;
  • __next__(): シーケンス内の次の要素を返す。要素が残っていない場合、走査の終了を示すためにStopIteration例外を発生させる。

イテレータは、イテラブル(例:リストや文字列)の要素を1つずつ走査し、その位置を保持することを可能にします。

iterator = iter(iterable)

注意

イテレータ__iter__()メソッドを実装しているため、イテラブルでもあります。

すべてのイテラブルがイテレータであるとは限りません。例えば、リストはイテラブルですがイテレータではありません。iter()関数に渡すと、要素ごとに走査できるイテレータが得られます。

カスタムイテレータの作成

このイテレータは、固定回数のランダムなサイコロの出目を生成し、すべての出目が完了すると停止します。

123456789101112131415161718192021222324252627
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
copy

イテレータの消費

一度イテレータが消費されると、再作成しない限り再利用できません。例えば:

12345678910
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
copy

イテレータは一度だけ走査可能。再度イテレートするには、新しいイテレータの作成が必要。

タスク

スワイプしてコーディングを開始

コードの不足部分を完成させて、無限ダイスロールをシミュレートするカスタムのイテレータクラスを実装してください。このイテレータは、6面ダイスのランダムな出目を遅延的に生成し、10回のロール後に停止します。

  1. __iter__() メソッドは、オブジェクトをイテレータとして使用できるようにします。
  2. __next__() メソッドは、次のランダムなダイスの出目(1から6の数値)を生成します。
  3. ダイスロールを表す InfiniteDie クラスのインスタンスを作成します。
  4. enumerate() を使ったforループでダイスを遅延的にロールします。if条件とbreak文を使って10回のロール後に停止してください。

解答

Switch to desktop実践的な練習のためにデスクトップに切り替える下記のオプションのいずれかを利用して、現在の場所から続行する
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 6.  2
single

single

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

some-alt