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:
@@ -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()
|
||||
Reference in New Issue
Block a user