#!/usr/bin/env PYTHONHASHSEED=1234 python3 # Copyright 2014-2019 Brett Slatkin, Pearson Education Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Reproduce book environment import random random.seed(1234) import logging from pprint import pprint from sys import stdout as STDOUT # Write all output to a temporary directory import atexit import gc import io import os import tempfile TEST_DIR = tempfile.TemporaryDirectory() atexit.register(TEST_DIR.cleanup) # Make sure Windows processes exit cleanly OLD_CWD = os.getcwd() atexit.register(lambda: os.chdir(OLD_CWD)) os.chdir(TEST_DIR.name) def close_open_files(): everything = gc.get_objects() for obj in everything: if isinstance(obj, io.IOBase): obj.close() atexit.register(close_open_files) # Example 1 def get_stats(numbers): minimum = min(numbers) maximum = max(numbers) return minimum, maximum lengths = [63, 73, 72, 60, 67, 66, 71, 61, 72, 70] minimum, maximum = get_stats(lengths) # Two return values print(f'Min: {minimum}, Max: {maximum}') # Example 2 first, second = 1, 2 assert first == 1 assert second == 2 def my_function(): return 1, 2 first, second = my_function() assert first == 1 assert second == 2 # Example 3 def get_avg_ratio(numbers): average = sum(numbers) / len(numbers) scaled = [x / average for x in numbers] scaled.sort(reverse=True) return scaled longest, *middle, shortest = get_avg_ratio(lengths) print(f'Longest: {longest:>4.0%}') print(f'Shortest: {shortest:>4.0%}') # Example 4 def get_stats(numbers): minimum = min(numbers) maximum = max(numbers) count = len(numbers) average = sum(numbers) / count sorted_numbers = sorted(numbers) middle = count // 2 if count % 2 == 0: lower = sorted_numbers[middle - 1] upper = sorted_numbers[middle] median = (lower + upper) / 2 else: median = sorted_numbers[middle] return minimum, maximum, average, median, count minimum, maximum, average, median, count = get_stats(lengths) print(f'Min: {minimum}, Max: {maximum}') print(f'Average: {average}, Median: {median}, Count {count}') assert minimum == 60 assert maximum == 73 assert average == 67.5 assert median == 68.5 assert count == 10 # Verify odd count median _, _, _, median, count = get_stats([1, 2, 3]) assert median == 2 assert count == 3 # Example 5 # Correct: minimum, maximum, average, median, count = get_stats(lengths) # Oops! Median and average swapped: minimum, maximum, median, average, count = get_stats(lengths) # Example 6 minimum, maximum, average, median, count = get_stats( lengths) minimum, maximum, average, median, count = \ get_stats(lengths) (minimum, maximum, average, median, count) = get_stats(lengths) (minimum, maximum, average, median, count ) = get_stats(lengths)