Skip to content

Commit 7f719a3

Browse files
authored
Merge pull request #360 from realpython/python-iterators-iterables
Sample code for the iterators and iterables article
2 parents cd08468 + 338a396 commit 7f719a3

File tree

15 files changed

+234
-0
lines changed

15 files changed

+234
-0
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Iterators and Iterables in Python: Run Efficient Iterations
2+
3+
This folder provides the code examples for the Real Python tutorial [Iterators and Iterables in Python: Run Efficient Iterations](https://realpython.com/python-iterators-iterables/).
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import asyncio
2+
from random import randint
3+
4+
5+
class AsyncIterable:
6+
def __init__(self, stop):
7+
self.stop = stop
8+
self.index = 0
9+
10+
def __aiter__(self):
11+
return self
12+
13+
async def __anext__(self):
14+
if self.index >= self.stop:
15+
raise StopAsyncIteration
16+
await asyncio.sleep(value := randint(1, 3))
17+
self.index += 1
18+
return value
19+
20+
21+
async def main():
22+
async for num in AsyncIterable(4):
23+
print(num)
24+
25+
26+
asyncio.run(main())
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# def fibonacci_generator(stop=10):
2+
# current_fib, next_fib = 0, 1
3+
# for _ in range(0, stop):
4+
# fib_number = current_fib
5+
# current_fib, next_fib = next_fib, current_fib + next_fib
6+
# yield fib_number
7+
8+
9+
def fibonacci_generator(stop=10):
10+
current_fib, next_fib = 0, 1
11+
index = 0
12+
while True:
13+
if index == stop:
14+
return
15+
index += 1
16+
fib_number = current_fib
17+
current_fib, next_fib = next_fib, current_fib + next_fib
18+
yield fib_number
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class FibonacciIterator:
2+
def __init__(self, stop=10):
3+
self._stop = stop
4+
self._index = 0
5+
self._current = 0
6+
self._next = 1
7+
8+
def __iter__(self):
9+
return self
10+
11+
def __next__(self):
12+
if self._index < self._stop:
13+
self._index += 1
14+
fib_number = self._current
15+
self._current, self._next = (
16+
self._next,
17+
self._current + self._next,
18+
)
19+
return fib_number
20+
else:
21+
raise StopIteration
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class FibonacciInfIterator:
2+
def __init__(self):
3+
self._index = 0
4+
self._current = 0
5+
self._next = 1
6+
7+
def __iter__(self):
8+
return self
9+
10+
def __next__(self):
11+
self._index += 1
12+
fib_number = self._current
13+
self._current, self._next = self._next, self._current + self._next
14+
return fib_number
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class InfIntegers:
2+
def __init__(self):
3+
self._number = 0
4+
5+
def __iter__(self):
6+
return self
7+
8+
def __next__(self):
9+
number = self._number
10+
self._number += 1
11+
return number
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
def to_square(numbers):
2+
return (number**2 for number in numbers)
3+
4+
5+
def to_cube(numbers):
6+
return (number**3 for number in numbers)
7+
8+
9+
def to_even(numbers):
10+
return (number for number in numbers if number % 2 == 0)
11+
12+
13+
def to_odd(numbers):
14+
return (number for number in numbers if number % 2 != 0)
15+
16+
17+
def to_string(numbers):
18+
return (str(number) for number in numbers)
19+
20+
21+
print(list(to_string(to_square(to_even(range(20))))))
22+
print(list(to_string(to_cube(to_odd(range(20))))))
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class ResettableRange:
2+
def __init__(self, start=0, end=None, step=1, *, resettable=False):
3+
if end is None:
4+
end, start = start, 0
5+
self._start = start
6+
self._end = end
7+
self._step = step
8+
self._resettable = resettable
9+
10+
def __iter__(self):
11+
return self
12+
13+
def __next__(self):
14+
if self._start >= self._end:
15+
if self._resettable:
16+
self._start = 0
17+
raise StopIteration
18+
value = self._start
19+
self._start += self._step
20+
return value
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class ReusableRange:
2+
def __init__(self, start=0, stop=None, step=1):
3+
if stop is None:
4+
stop, start = start, 0
5+
self._range = range(start, stop, step)
6+
self._iter = iter(self._range)
7+
8+
def __iter__(self):
9+
return self
10+
11+
def __next__(self):
12+
try:
13+
return next(self._iter)
14+
except StopIteration:
15+
self._iter = iter(self._range)
16+
raise
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class SequenceIterator:
2+
def __init__(self, sequence):
3+
self._sequence = sequence
4+
self._index = 0
5+
6+
def __iter__(self):
7+
return self
8+
9+
def __next__(self):
10+
if self._index < len(self._sequence):
11+
item = self._sequence[self._index]
12+
self._index += 1
13+
return item
14+
else:
15+
raise StopIteration
16+
17+
18+
class Iterable:
19+
def __init__(self, sequence):
20+
self.sequence = sequence
21+
22+
def __iter__(self):
23+
return SequenceIterator(self.sequence)

0 commit comments

Comments
 (0)