Answers: Strong Code#

Provided here are answers to the practice questions at the end of “Strong Code”.

Code Style#

Code Style Q1#

# fixes: snake_case function name, descriptive parameter names,
# spaces around operators, one statement per line, no semicolons
def calculate_bmi(weight, height):

    output = weight / height ** 2

    return output

Code Style Q2#

n_students = 25
course_full = True
avg_grade = 88.5

Documentation#

Documentation Q1#

# exact docstring and comment wording will differ
def count_evens(number_list):
    """Return the number of even values in the input list.

    Parameters
    ----------
    number_list : list of int
        The list of numbers to check for even values.

    Returns
    -------
    count : int
        The number of even values in number_list.
    """

    count = 0

    for value in number_list:
        # a value is even if dividing it by 2 leaves no remainder
        if value % 2 == 0:
            count += 1

    return count

Code Testing#

Code Testing Q1#

class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def birthday(self):
        self.age += 1
        return 'Happy Birthday!'
import unittest

class TestPerson(unittest.TestCase):

    def setUp(self):
        # runs before EACH test method - every test gets a fresh Person
        self.jonathan = Person('Jonathan', 20)

    def test_is_person_instance(self):
        self.assertIsInstance(self.jonathan, Person)

    def test_attributes(self):
        self.assertEqual(self.jonathan.name, 'Jonathan')
        self.assertEqual(self.jonathan.age, 20)

    def test_birthday_increments_age(self):
        output = self.jonathan.birthday()
        self.assertEqual(self.jonathan.age, 21)
        self.assertEqual(output, 'Happy Birthday!')

unittest.main(argv=['', 'TestPerson'], verbosity=2, exit=False);

Code Testing Q2#

import unittest

class TestAbsoluteDifference(unittest.TestCase):

    def test_first_input_larger(self):
        self.assertEqual(absolute_difference(5, 3), 2)

    def test_second_input_larger(self):
        # this test catches the bug: the original returns -2
        self.assertEqual(absolute_difference(3, 5), 2)

    def test_equal_inputs(self):
        self.assertEqual(absolute_difference(4, 4), 0)

unittest.main(argv=['', 'TestAbsoluteDifference'], verbosity=2, exit=False);
# the fixed function: return the difference as a positive value
# (a conditional swapping the subtraction order would also work)
def absolute_difference(num1, num2):
    return abs(num1 - num2)

Code Testing Q3#

import unittest

class TestBankAccount(unittest.TestCase):

    def setUp(self):
        # runs before EACH test method - every test gets a fresh account
        self.account = BankAccount()

    def test_new_account_balance_is_zero(self):
        self.assertEqual(self.account.balance, 0)

    def test_deposit_increases_balance(self):
        self.account.deposit(100)
        self.assertEqual(self.account.balance, 100)

    def test_withdraw_decreases_balance(self):
        self.account.deposit(100)
        self.account.withdraw(40)
        self.assertEqual(self.account.balance, 60)

    def test_overdraw_raises_error(self):
        with self.assertRaises(ValueError):
            self.account.withdraw(1)

unittest.main(argv=['', 'TestBankAccount'], verbosity=2, exit=False);