Errata From https://nostarch.com/impracticalpythonprojects
Page 79: code output at bottom of page is based on Figure 4-3, not Figure 4-2.
Page 85: In Listing 4-9, the code at wingding 5 and the following line that read: row1 = (message[:row_1_len]) row2 = (message[row_1_len:]) Should instead read: row1 = (message[:row_1_len]).lower() row2 = (message[row_1_len:]).lower()
Also in Listing 4-9, the code immediately below wingding 8 that reads: plaintext.append(r1.lower()) plaintext.append(r2.lower()) Should instead read: plaintext.append(r1) plaintext.append(r2)
Page 100: The output printout near the bottom of page that reads: Panel at east end of chapel slides Should instead read: Panelateastendofchapelslides
Page 103: The cipher example that reads: The cold tea didn’t please the old finicky woman. Should instead read: So, the cold tea didn’t please the old finicky woman.
Page 141: Wingding 7 and the preceding line in Listing 7-10 that read: lock_wheel = int(randrange(0, len(combo))) next_try[lock_wheel] = randint(0, len(combo)-1) Should instead read: lock_wheel = randrange(0, len(combo)) next_try[lock_wheel] = randint(0, 9)
Page 205: The line and following equation that read: The transformation to generate points over a unit disc is as follows: x= √rcos Should instead read as: The transformation to generate points evenly over a unit disc is: x= √rcosθ
And the line that reads: The equations yield (x, y) values between 0 and 1. Should instead read as: The equations yield (x, y) values between -1 and 1.
Page 218: Indentation for the listing on the page should be as follows:
from random import randint
trials = 100000
success = 0
for trial in range(trials):
faces = set()
for rolls in range(6):
roll = randint(1, 6)
faces.add(roll)
if len(faces) == 6:
success += 1
print("probability of success = {}".format(success/trials)) probability of success = 0.01528
Page 250: Listing 12-1 should read as: import sys import random import matplotlib.pyplot as plt
def read_to_list(file_name):
"""Open a file of data in percent, convert to decimal & return a list."""
with open(file_name) as in_file:
lines = [float(line.strip()) for line in in_file]
decimal = [round(line / 100, 5) for line in lines]
return decimal
def default_input(prompt, default=None):
"""Allow use of default values in input"""
prompt = '{} [{}]: '.format(prompt, default)
response = input(prompt)
if not response and default:
return default
else:
return response
Page 252: The last line on page that reads: Set the default to 'sbc_blend', since this is theoretically the most stable mix of the four choices. Should instead read as: Set the default to 'bonds', in order to see how this supposedly “safe” choice performs.
Page 259: The first line in last paragraph that reads: Let’s work an example that assumes a starting value of $2,000,000, a “safe and secure” bond portfolio, a 4 percent withdrawal rate (equal to $80,000 per year), a 30-year retirement, and 50,000 cases. Should instead read as: Let’s work an example that assumes a starting value of $2,000,000, a “safe and secure” bond portfolio, a 4 percent withdrawal rate (equal to $80,000 per year), a 29-30-31 retirement range, and 50,000 cases.
Page 261: The last two lines in Listing 12-9 that read:
investments -= withdraw_infl_adj
investments = int(investments * (1 + i))
Should instead read as:
investments -= withdraw_infl_adj
investments = int(investments * (1 + i))
Page 305: In the last paragraph, transform_rotate() should be transform.rotate()
Page 356: Between wingdings 5 and 6, Listing 16-2 should read as: # check for missing digits keys = [str(digit) for digit in range(1, 10)] for key in keys: if key not in first_digits: first_digits[key] = 0
Page 368: The code for Dictionary Cleanup should read as: """Remove single-letter words from list if not 'a' or 'i'.""" word_list = ['a', 'nurses', 'i', 'stack', 'b', 'c', 'cat'] word_list_clean = []
permissible = ('a', 'i')
for word in word_list: if len(word) > 1: word_list_clean.append(word) elif len(word) == 1 and word in permissible: word_list_clean.append(word) else: continue print("{}".