Introduction to Functions

cereal = pd.read_csv('data/cereal.csv')
cereal.head()
name mfr type calories ... shelf weight cups rating
0 100% Bran N Cold 70 ... 3 1.0 0.33 68.402973
1 100% Natural Bran Q Cold 120 ... 3 1.0 1.00 33.983679
2 All-Bran K Cold 70 ... 3 1.0 0.33 59.425505
3 All-Bran with Extra Fiber K Cold 50 ... 3 1.0 0.50 93.704912
4 Almond Delight R Cold 110 ... 3 1.0 0.75 34.384843

5 rows × 16 columns


addition = sum([1, 2, 3, 4, 5])
addition
15

Functions and the DRY principle

numbers = [ 2, 3, 5]
squared = list()

squared.append(numbers[0] ** 2)
squared.append(numbers[1] ** 2)
squared.append(numbers[2] ** 2)
squared
[4, 9, 25]


squared = list()
for number in numbers: 
    squared.append(number ** 2)
squared
[4, 9, 25]
larger_numbers = [5, 44, 55, 23, 11]
promoted_numbers = [73, 84, 95]
executive_numbers = [100, 121, 250, 103, 183, 222, 214]
larger_numbers_squared = list()
for number in larger_numbers: 
    larger_numbers_squared.append(number ** 2)
larger_numbers_squared
[25, 1936, 3025, 529, 121]


even_larger_numbers_squared = list()
for number in promoted_numbers: 
    even_larger_numbers_squared.append(number ** 2)
even_larger_numbers_squared
[5329, 7056, 9025]


extra_larger_numbers_squared = list()
for number in executive_numbers: 
    extra_larger_numbers_squared.append(number ** 2)
extra_larger_numbers_squared
[10000, 14641, 62500, 10609, 33489, 49284, 45796]
squared = list()
for number in numbers: 
    squared.append(number ** 2)
squared


def squares_a_list(numerical_list):
    new_squared_list = list()
    
    for number in numerical_list:
        new_squared_list.append(number ** 2)
    
    return new_squared_list


numbers = [ 2, 3, 5]
squares_a_list(numbers)
[4, 9, 25]

Syntax

def squares_a_list(numerical_list):
    new_squared_list = list()
    
    for number in numerical_list:
        new_squared_list.append(number ** 2)
    
    return new_squared_list


Let’s take a look at the how we define a function:

404 image
404 image


def not_a_great_function(numerical_list):
    new_squared_list = list()
    for number in numerical_list:
        new_squared_list.append(number ** 2)
    new_squared_list


not_a_great_function([1, 2, 3])
def squares_a_list(numerical_list):
    new_squared_list = list()
    
    for number in numerical_list:
        new_squared_list.append(number ** 2)
    
    return new_squared_list
numbers = [ 1, 2, 3, 4]
squares_a_list(numbers)
[1, 4, 9, 16]


larger_numbers = [5, 44, 55, 23, 11]
squares_a_list(larger_numbers)
[25, 1936, 3025, 529, 121]


promoted_numbers = [73, 84, 95]
squares_a_list(promoted_numbers)
[5329, 7056, 9025]


executive_numbers = [100, 121, 250, 103, 183, 222, 214]
squares_a_list(executive_numbers)
[10000, 14641, 62500, 10609, 33489, 49284, 45796]
numbers = [ 1, 2, 3, 4]
larger_numbers = [5, 44, 55, 23, 11]
promoted_numbers = [73, 84, 95]
executive_numbers = [100, 121, 250, 103, 183, 222, 214]


for list_of_numbers in [numbers, larger_numbers, promoted_numbers, executive_numbers]:
    print(squares_a_list(list_of_numbers))
[1, 4, 9, 16]
[25, 1936, 3025, 529, 121]
[5329, 7056, 9025]
[10000, 14641, 62500, 10609, 33489, 49284, 45796]

Designing Good Functions

There is some ambiguity for how and when to design a function.

  • Should squares_a_list() be a function if I’m only ever using it once?
  • Should the loop be inside the function, or outside?
def squares_a_list(numerical_list):
    new_squared_list = list()
    
    for number in numerical_list:
        new_squared_list.append(number ** 2)
    
    return new_squared_list

Let’s apply what we learned!