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);