Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Understanding Iterators | Iterators and Generators
Python Advanced Concepts
course content

Course Content

Python Advanced Concepts

Python Advanced Concepts

1. Modules and Imports
2. Error Handling
3. File Handling
4. Pytest Framework
5. Unittest Framework
6. Iterators and Generators

bookUnderstanding Iterators

What Are Iterators?

Technically, in Python, an iterator is an object that implements the iterator protocol, which consists of the following methods:

  • __iter__(): returns the iterator object itself, making it compatible with loops like for;
  • __next__(): returns the next element in the sequence. When no elements remain, it raises a StopIteration exception to signal the end of traversal.

An iterator enables traversal of elements in an iterable (e.g., list or string) one at a time while keeping track of its position.

Note

An iterator is also an iterable because it implements the __iter__() method.

Not all iterables are iterators. For example, a list is iterable but not an iterator. When you pass it to the iter() function, you get an iterator that allows element-by-element traversal.

Building a Custom Iterator

This iterator generates a fixed number of random dice rolls and stops once all rolls are completed.

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

Iterator Exhaustion

Once an iterator is exhausted, it cannot be reused without recreating it. For example:

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

Iterators can only be traversed once. To iterate again, a new iterator needs to be created.

Task
test

Swipe to show code editor

Complete the missing parts of the code to implement a custom iterator class for simulating an infinite die roller. The iterator should lazily generate random rolls of a six-sided die and stop after 10 rolls.

  1. The __iter__() method allows an object to be used as an iterator.
  2. The __next__() method produces the next random die roll (a number between 1 and 6).
  3. Create an instance of the InfiniteDie class, which represents the die roller.
  4. Use a for loop with enumerate() to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.

Switch to desktopSwitch to desktop for real-world practiceContinue from where you are using one of the options below
Everything was clear?

How can we improve it?

Thanks for your feedback!

Section 6. Chapter 2
toggle bottom row

bookUnderstanding Iterators

What Are Iterators?

Technically, in Python, an iterator is an object that implements the iterator protocol, which consists of the following methods:

  • __iter__(): returns the iterator object itself, making it compatible with loops like for;
  • __next__(): returns the next element in the sequence. When no elements remain, it raises a StopIteration exception to signal the end of traversal.

An iterator enables traversal of elements in an iterable (e.g., list or string) one at a time while keeping track of its position.

Note

An iterator is also an iterable because it implements the __iter__() method.

Not all iterables are iterators. For example, a list is iterable but not an iterator. When you pass it to the iter() function, you get an iterator that allows element-by-element traversal.

Building a Custom Iterator

This iterator generates a fixed number of random dice rolls and stops once all rolls are completed.

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

Iterator Exhaustion

Once an iterator is exhausted, it cannot be reused without recreating it. For example:

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

Iterators can only be traversed once. To iterate again, a new iterator needs to be created.

Task
test

Swipe to show code editor

Complete the missing parts of the code to implement a custom iterator class for simulating an infinite die roller. The iterator should lazily generate random rolls of a six-sided die and stop after 10 rolls.

  1. The __iter__() method allows an object to be used as an iterator.
  2. The __next__() method produces the next random die roll (a number between 1 and 6).
  3. Create an instance of the InfiniteDie class, which represents the die roller.
  4. Use a for loop with enumerate() to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.

Switch to desktopSwitch to desktop for real-world practiceContinue from where you are using one of the options below
Everything was clear?

How can we improve it?

Thanks for your feedback!

Section 6. Chapter 2
toggle bottom row

bookUnderstanding Iterators

What Are Iterators?

Technically, in Python, an iterator is an object that implements the iterator protocol, which consists of the following methods:

  • __iter__(): returns the iterator object itself, making it compatible with loops like for;
  • __next__(): returns the next element in the sequence. When no elements remain, it raises a StopIteration exception to signal the end of traversal.

An iterator enables traversal of elements in an iterable (e.g., list or string) one at a time while keeping track of its position.

Note

An iterator is also an iterable because it implements the __iter__() method.

Not all iterables are iterators. For example, a list is iterable but not an iterator. When you pass it to the iter() function, you get an iterator that allows element-by-element traversal.

Building a Custom Iterator

This iterator generates a fixed number of random dice rolls and stops once all rolls are completed.

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

Iterator Exhaustion

Once an iterator is exhausted, it cannot be reused without recreating it. For example:

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

Iterators can only be traversed once. To iterate again, a new iterator needs to be created.

Task
test

Swipe to show code editor

Complete the missing parts of the code to implement a custom iterator class for simulating an infinite die roller. The iterator should lazily generate random rolls of a six-sided die and stop after 10 rolls.

  1. The __iter__() method allows an object to be used as an iterator.
  2. The __next__() method produces the next random die roll (a number between 1 and 6).
  3. Create an instance of the InfiniteDie class, which represents the die roller.
  4. Use a for loop with enumerate() to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.

Switch to desktopSwitch to desktop for real-world practiceContinue from where you are using one of the options below
Everything was clear?

How can we improve it?

Thanks for your feedback!

What Are Iterators?

Technically, in Python, an iterator is an object that implements the iterator protocol, which consists of the following methods:

  • __iter__(): returns the iterator object itself, making it compatible with loops like for;
  • __next__(): returns the next element in the sequence. When no elements remain, it raises a StopIteration exception to signal the end of traversal.

An iterator enables traversal of elements in an iterable (e.g., list or string) one at a time while keeping track of its position.

Note

An iterator is also an iterable because it implements the __iter__() method.

Not all iterables are iterators. For example, a list is iterable but not an iterator. When you pass it to the iter() function, you get an iterator that allows element-by-element traversal.

Building a Custom Iterator

This iterator generates a fixed number of random dice rolls and stops once all rolls are completed.

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

Iterator Exhaustion

Once an iterator is exhausted, it cannot be reused without recreating it. For example:

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

Iterators can only be traversed once. To iterate again, a new iterator needs to be created.

Task
test

Swipe to show code editor

Complete the missing parts of the code to implement a custom iterator class for simulating an infinite die roller. The iterator should lazily generate random rolls of a six-sided die and stop after 10 rolls.

  1. The __iter__() method allows an object to be used as an iterator.
  2. The __next__() method produces the next random die roll (a number between 1 and 6).
  3. Create an instance of the InfiniteDie class, which represents the die roller.
  4. Use a for loop with enumerate() to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.

Switch to desktopSwitch to desktop for real-world practiceContinue from where you are using one of the options below
Section 6. Chapter 2
Switch to desktopSwitch to desktop for real-world practiceContinue from where you are using one of the options below
We're sorry to hear that something went wrong. What happened?
some-alt