Course Content
Python Advanced Concepts
Python Advanced Concepts
Understanding 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 likefor
;__next__()
: returns the next element in the sequence. When no elements remain, it raises aStopIteration
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.
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}")
Iterator Exhaustion
Once an iterator is exhausted, it cannot be reused without recreating it. For example:
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.
Iterators can only be traversed once. To iterate again, a new iterator needs to be created.
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.
- The
__iter__()
method allows an object to be used as an iterator. - The
__next__()
method produces the next random die roll (a number between 1 and 6). - Create an instance of the
InfiniteDie
class, which represents the die roller. - Use a for loop with
enumerate()
to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.
Thanks for your feedback!
Understanding 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 likefor
;__next__()
: returns the next element in the sequence. When no elements remain, it raises aStopIteration
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.
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}")
Iterator Exhaustion
Once an iterator is exhausted, it cannot be reused without recreating it. For example:
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.
Iterators can only be traversed once. To iterate again, a new iterator needs to be created.
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.
- The
__iter__()
method allows an object to be used as an iterator. - The
__next__()
method produces the next random die roll (a number between 1 and 6). - Create an instance of the
InfiniteDie
class, which represents the die roller. - Use a for loop with
enumerate()
to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.
Thanks for your feedback!
Understanding 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 likefor
;__next__()
: returns the next element in the sequence. When no elements remain, it raises aStopIteration
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.
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}")
Iterator Exhaustion
Once an iterator is exhausted, it cannot be reused without recreating it. For example:
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.
Iterators can only be traversed once. To iterate again, a new iterator needs to be created.
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.
- The
__iter__()
method allows an object to be used as an iterator. - The
__next__()
method produces the next random die roll (a number between 1 and 6). - Create an instance of the
InfiniteDie
class, which represents the die roller. - Use a for loop with
enumerate()
to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.
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 likefor
;__next__()
: returns the next element in the sequence. When no elements remain, it raises aStopIteration
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.
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}")
Iterator Exhaustion
Once an iterator is exhausted, it cannot be reused without recreating it. For example:
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.
Iterators can only be traversed once. To iterate again, a new iterator needs to be created.
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.
- The
__iter__()
method allows an object to be used as an iterator. - The
__next__()
method produces the next random die roll (a number between 1 and 6). - Create an instance of the
InfiniteDie
class, which represents the die roller. - Use a for loop with
enumerate()
to roll the die lazily. Stop after 10 rolls using an if condition and the break statement.