Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is the Iterator protocol in Python?
The Iterator protocol is a way Python objects provide a standard way to access elements one at a time, using two methods: __iter__() and __next__().
Click to reveal answer
beginner
What does the __iter__() method do?
The __iter__() method returns the iterator object itself. It allows an object to be used in a loop like for.
Click to reveal answer
beginner
What happens when __next__() is called on an iterator?
The __next__() method returns the next item from the container. If there are no more items, it raises a StopIteration exception to signal the end.
Click to reveal answer
intermediate
How does a for loop use the Iterator protocol internally?
A for loop calls __iter__() to get an iterator, then repeatedly calls __next__() to get each item until StopIteration is raised.
Click to reveal answer
intermediate
How can you make a custom object iterable using the Iterator protocol?
Define __iter__() to return an iterator object, and define __next__() in that iterator to return items one by one, raising StopIteration when done.
Click to reveal answer
Which method must an iterator implement to return the next item?
A__next__()
B__iter__()
C__getitem__()
D__call__()
✗ Incorrect
The __next__() method returns the next item or raises StopIteration when done.
What does the __iter__() method return?
AThe iterator object itself
BA list of all items
CThe first item
DNone
✗ Incorrect
__iter__() returns the iterator object to be used in loops.
What exception signals the end of iteration?
ATypeError
BIndexError
CValueError
DStopIteration
✗ Incorrect
StopIteration tells Python that no more items are available.
Which of these is true about an iterable?
AIt raises StopIteration immediately
BIt has an __iter__() method
CIt has a __next__() method
DIt is always a list
✗ Incorrect
An iterable must have an __iter__() method that returns an iterator.
What happens if you call next() on an iterator with no more items?
ARaises TypeError
BReturns None
CRaises StopIteration
DReturns the last item again
✗ Incorrect
Calling next() on an exhausted iterator raises StopIteration.
Explain how the Iterator protocol works in Python and why it is useful.
Think about how Python loops over things like lists or files.
You got /5 concepts.
Describe how you would create a custom iterator for your own object.
Focus on the two special methods needed.
You got /3 concepts.
Practice
(1/5)
1. What does the __iter__ method do in the iterator protocol?
easy
A. Returns the iterator object itself
B. Returns the next item in the sequence
C. Stops the iteration
D. Creates a list from the iterable
Solution
Step 1: Understand the role of __iter__
The __iter__ method is called to get an iterator object from an iterable.
Step 2: Identify what __iter__ returns
It returns the iterator object itself, which has the __next__ method to fetch items.
Final Answer:
Returns the iterator object itself -> Option A
Quick Check:
__iter__ returns iterator object [OK]
Hint: Remember: __iter__ returns the iterator itself [OK]
Common Mistakes:
Confusing __iter__ with __next__
Thinking __iter__ returns the next item
Assuming __iter__ stops iteration
2. Which of the following is the correct way to define an iterator class in Python?
easy
A. class MyIter:
def __next__(self):
pass
B. class MyIter:
def next(self):
pass
C. class MyIter:
def __iter__(self):
return self
def __next__(self):
pass
D. class MyIter:
def iter(self):
return self
Solution
Step 1: Check required methods for iterator
An iterator class must have __iter__ returning self and __next__ to get next item.
Step 2: Match methods with options
class MyIter:
def __iter__(self):
return self
def __next__(self):
pass correctly defines both __iter__ and __next__ methods.
Final Answer:
Defines both __iter__ and __next__ methods -> Option C
Quick Check:
Iterator class needs __iter__ and __next__ [OK]
Hint: Iterator class must have __iter__ and __next__ methods [OK]
Common Mistakes:
Using next() instead of __next__()
Missing __iter__ method
Defining iter() instead of __iter__()
3. What will be the output of this code?
class Count:
def __init__(self, limit):
self.limit = limit
self.num = 0
def __iter__(self):
return self
def __next__(self):
if self.num < self.limit:
self.num += 1
return self.num
else:
raise StopIteration
for i in Count(3):
print(i, end=' ')
medium
A. Error: StopIteration not handled
B. 0 1 2
C. 1 2 3 4
D. 1 2 3
Solution
Step 1: Understand the iterator behavior
The Count class starts num at 0 and returns num+1 until it reaches limit 3.
Step 2: Trace the loop output
Loop prints 1, 2, 3 then raises StopIteration to end loop.
Final Answer:
1 2 3 -> Option D
Quick Check:
Count(3) yields 1 to 3 [OK]
Hint: StopIteration ends loop; count from 1 to limit [OK]
Common Mistakes:
Starting count from 0 instead of 1
Expecting 4 as output
Thinking StopIteration causes error
4. Identify the error in this iterator implementation:
class MyIter:
def __init__(self):
self.data = [1, 2, 3]
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index <= len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
medium
A. The condition should be self.index < len(self.data)
B. Missing return self in __iter__
C. Should raise StopIteration before returning result
D. Index should start at 1, not 0
Solution
Step 1: Analyze the index condition
Index goes from 0 to len(data)-1. Using <= allows index == len(data), causing IndexError.
Step 2: Correct the condition
Change condition to self.index < len(self.data) to avoid out-of-range access.
Final Answer:
The condition should be self.index < len(self.data) -> Option A
Quick Check:
Index must be less than length to avoid error [OK]
Hint: Use < to avoid index out of range errors [OK]
Common Mistakes:
Using <= instead of < in index check
Forgetting to return self in __iter__
Starting index at 1 instead of 0
5. You want to create a custom iterator that returns only even numbers from 0 up to a given limit (exclusive). Which implementation correctly follows the iterator protocol and filters evens?
class EvenIterator:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
return self
def __next__(self):
while self.current < self.limit:
val = self.current
self.current += 1
if val % 2 == 0:
return val
raise StopIteration
hard
A. Fails because __iter__ should return a new object each time
B. Correct implementation returning even numbers up to limit
C. Incorrect because it returns odd numbers instead
D. Raises StopIteration too early, missing some evens
Solution
Step 1: Check iterator protocol methods
Class defines __iter__ returning self and __next__ with loop and StopIteration.
Step 2: Verify filtering logic
Inside __next__, it loops until limit, returns only even values, skipping odds.
Final Answer:
Correct implementation returning even numbers up to limit -> Option B
Quick Check:
Iterator filters evens correctly [OK]
Hint: Use while loop inside __next__ to skip unwanted items [OK]