Skip to content

Commit dac706a

Browse files
committed
Chapter 10
1 parent 5906202 commit dac706a

13 files changed

Lines changed: 300 additions & 0 deletions

Ch10/coroutine_sequence.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
def coroutine():
2+
ret = None
3+
while True:
4+
print("...")
5+
recv = yield ret
6+
print(f"recv: {recv}")
7+
ret = recv
8+
9+
10+
co = coroutine()
11+
current = co.send(None)
12+
print(f"current (ret): {current}")
13+
14+
for i in range(10):
15+
current = co.send(i)
16+
print(f"current (ret): {current}")
17+
18+
co.close()

Ch10/divis_by_three.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# divis_by_three = (n for n in range(100) if n % 3 == 0)
2+
divis_by_three = (n if n % 3 == 0 else "redacted" for n in range(100))

Ch10/license_generator.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from itertools import product
2+
from string import ascii_uppercase as alphabet
3+
4+
5+
def gen_license_plates():
6+
for letters in product(alphabet, repeat=3):
7+
letters = "".join(letters)
8+
if letters == 'GOV':
9+
continue
10+
11+
for numbers in range(1000):
12+
yield f'{letters} {numbers:03}'
13+
14+
15+
license_plates = gen_license_plates()
16+
17+
# for plate in license_plates:
18+
# print(plate)
19+
20+
registrations = {}
21+
22+
23+
def new_registration(owner):
24+
if owner not in registrations:
25+
plate = next(license_plates)
26+
registrations[owner] = plate
27+
return plate
28+
return None
29+
30+
31+
# Fast-forward through several results for testing purposes.
32+
for _ in range(4441888):
33+
next(license_plates)
34+
35+
name = "Jason C. McDonald"
36+
my_plate = new_registration(name)
37+
print(my_plate)
38+
print(registrations[name])

Ch10/license_plates.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from itertools import product
2+
from string import ascii_uppercase as alphabet
3+
4+
# def license_plates():
5+
# for num in range(1000):
6+
# yield f"ABC {num:03}"
7+
8+
# license_plates = (
9+
# f"ABC {number:03}"
10+
# for number in range(1000)
11+
# )
12+
13+
license_plates = (
14+
f'{letters} {number:03}'
15+
for letters in (
16+
"".join(chars)
17+
for chars in product(alphabet, repeat=3)
18+
)
19+
if letters != 'GOV'
20+
for number in range(1000)
21+
)
22+
23+
# for plate in license_plates():
24+
# for plate in license_plates:
25+
# print(plate)
26+
27+
registrations = {}
28+
29+
30+
def new_registration(owner):
31+
if owner not in registrations:
32+
plate = next(license_plates)
33+
registrations[owner] = plate
34+
return True
35+
return False
36+
37+
38+
# Fast-forward through several results for testing purposes.
39+
for _ in range(4441888):
40+
next(license_plates)
41+
42+
name = "Jason C. McDonald"
43+
my_plate = new_registration(name)
44+
print(registrations[name])

Ch10/odd_remainers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
odd_remainders = {100 % divisor for divisor in range(1, 100, 2)}
2+
print(odd_remainders)

Ch10/orders_comprehension.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
orders = ['cold brew', 'lemongrass tea', 'chai latte', 'medium drip',
2+
'french press', 'mocha cappuccino', 'pumpkin spice latte',
3+
'double-shot espresso', 'dark roast drip', 'americano']
4+
5+
drip_orders = [order for order in orders if 'drip' in order]
6+
7+
print(f'There are {len(drip_orders)} orders for drip coffee.')

Ch10/sleepy.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import time
2+
# sleepy = ['no pause', time.sleep(1), time.sleep(2)]
3+
# ...three second pause...
4+
# print(sleepy[0]) # prints 'no pause'
5+
6+
sleepy = (time.sleep(t) for t in range(0, 3))
7+
print("Calling...")
8+
next(sleepy)
9+
print("Done!")
10+
11+
# Not lazy
12+
sleepy = (time.sleep(t) for t in [1, 2, 3, 4, 5])
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
squares = {n : n ** 2 for n in range(1, 101)}
2+
print(squares[2])
3+
print(squares[7])
4+
print(squares[11])

Ch10/traffic_bikers_generator.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from random import choice, randint
2+
3+
colors = ['red', 'green', 'blue', 'silver', 'white', 'black']
4+
vehicles = ['car', 'truck', 'semi', 'motorcycle', None]
5+
6+
7+
def biker_gang():
8+
for _ in range(randint(2, 10)):
9+
color = choice(colors)
10+
yield f"{color} motorcycle"
11+
12+
13+
def traffic():
14+
while True:
15+
if randint(1, 50) == 50:
16+
yield from biker_gang()
17+
continue
18+
19+
vehicle = choice(vehicles)
20+
color = choice(colors)
21+
yield f"{color} {vehicle}"
22+
23+
24+
count = 0
25+
for count, vehicle in enumerate(traffic()):
26+
print(f"{vehicle}")
27+
if count == 100:
28+
break

Ch10/traffic_colors_coroutine.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from random import choice
2+
3+
4+
def color_counter(color):
5+
matches = 0
6+
while True:
7+
vehicle = yield matches
8+
if color in vehicle:
9+
matches += 1
10+
11+
12+
colors = ['red', 'green', 'blue', 'silver', 'white', 'black']
13+
vehicles = ['car', 'truck', 'semi', 'motorcycle']
14+
15+
16+
def traffic():
17+
while True:
18+
vehicle = choice(vehicles)
19+
color = choice(colors)
20+
yield f"{color} {vehicle}"
21+
22+
23+
counter = color_counter('red')
24+
# counter.send(None) # prime the coroutine
25+
next(counter) # prime the coroutine
26+
27+
matches = 0
28+
for count, vehicle in enumerate(traffic(), start=1):
29+
if count < 100:
30+
matches = counter.send(vehicle)
31+
else:
32+
counter.close()
33+
break
34+
35+
print(f"There were {matches} matches.")

0 commit comments

Comments
 (0)