Added example solutions to several chapters. Feel free to create a pull request with your answers. Also for the chapters that have no solutions yet :)

This commit is contained in:
Rick van Hattem
2022-09-05 00:04:00 +02:00
parent 82cf71ed1c
commit 500a31afac
34 changed files with 742 additions and 0 deletions
@@ -0,0 +1,31 @@
# Create a generator similar to `itertools.islice()` that allows for a
# negative step so you can execute `some_list[20:10:-1]`.
import itertools
def islice(iterable, start, stop, step):
if step > 0:
assert start <= stop, 'start must be less than stop'
yield from itertools.islice(iterable, start, stop, step)
else:
assert start >= stop, 'start must be greater than stop for negative step'
output = []
for i, item in enumerate(iterable):
if i >= stop:
output.append(item)
if i >= start:
break
yield from reversed(output)
def main():
some_iterable = iter(range(100))
print(list(islice(some_iterable, 20, 10, -1)))
print(list(islice(some_iterable, 10, 20, 1)))
if __name__ == '__main__':
main()
@@ -0,0 +1,21 @@
# Create a class that wraps a generator so it becomes sliceable by using
# `itertools.islice()` internally.
import itertools
class SliceableGenerator:
def __init__(self, gen):
self.gen = gen
def __getitem__(self, index):
return list(itertools.islice(self.gen, index.start, index.stop))
def main():
generator = SliceableGenerator(itertools.count())
print(generator[10:20])
if __name__ == '__main__':
main()
@@ -0,0 +1,18 @@
# Write a generator for the Fibonacci numbers.
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
def main():
fib = fibonacci()
for _ in range(10):
print(next(fib))
if __name__ == '__main__':
main()
@@ -0,0 +1,23 @@
# Write a generator that uses the sieve of Eratosthenes to generate prime
# numbers.
import itertools
def generate_primes():
'''Generate prime numbers using the sieve of Eratosthenes.'''
primes = []
for i in itertools.count(2):
if all(i % prime != 0 for prime in primes):
primes.append(i)
yield i
def main():
primes = generate_primes()
for _ in range(20):
print(next(primes))
if __name__ == '__main__':
main()