Overview
Teaching: 10 min
Exercises: 15 minQuestions
How can I create my own functions?
Objectives
Explain and identify the difference between function definition and function call.
Write a function that takes a small, fixed number of arguments and produces a single result.
def
with a name, parameters, and a block of code.def
.def print_greeting():
print('Hello!')
print_greeting()
Hello!
def print_date(year, month, day):
joined = str(year) + '/' + str(month) + '/' + str(day)
print(joined)
print_date(1871, 3, 19)
1871/3/19
()
contains the ingredients for the function
while the body contains the recipe.return
.return ...
to give a value back to the caller.return
occurs:
def average(values):
if len(values) == 0:
return None
return sum(values) / len(values)
a = average([1, 3, 4])
print('average of actual values:', a)
2.6666666666666665
print('average of empty list:', average([]))
None
return
a value automatically returns None
.result = print_date(1871, 3, 19)
print('result of call is:', result)
1871/3/19
result of call is: None
Definition and Use
What does the following program print?
~~~ def report(pressure): print(‘pressure is’, pressure)
print(‘calling’, report, 22.5)
Order of Operations
The example above:
result = print_date(1871, 3, 19) print('result of call is:', result)
printed: ~~~ 1871/3/19 result of call is: None ~~~
Explain why the two lines of output appeared in the order they did.
Encapsulation
Fill in the blanks to create a function that takes a single filename as an argument, loads the data in the file named by the argument, and returns the minimum value in that data.
import pandas def min_in_data(____): data = ____ return ____
Find the First
Fill in the blanks to create a function that takes a list of numbers as an argument and returns the first negative value in the list. What does your function do if the list is empty?
def first_negative(values): for v in ____: if ____: return ____
Calling by Name
What does this short program print?
def print_date(year, month, day): joined = str(year) + '/' + str(month) + '/' + str(day) print(joined) print_date(day=1, month=2, year=2003)
- When have you seen a function call like this before?
- When and why is it useful to call functions this way?
Encapsulating Data Analysis
Assume that the following code has been executed:
import pandas df = pandas.read_csv('gapminder_gdp_asia.csv', index_col=0) japan = df.ix['Japan']
- Complete the statements below to obtain the average GDP for Japan across the years reported for the 1980s.
year = 1983 gdp_decade = 'gdpPercap_' + str(year // ____) avg = (japan.ix[gdp_decade + ___] + japan.ix[gdp_decade + ___]) / 2
- Abstract the code above into a single function.
def avg_gdp_in_decade(country, continent, year): df = pd.read_csv('gapminder_gdp_'+___+'.csv',delimiter=',',index_col=0) ____ ____ ____ return avg
- How would you generalize this function if you did not know beforehand which specific years occurred as columns in the data? For instance, what if we also had data from years ending in 1 and 9 for each decade? (Hint: use the columns to filter out the ones that correspond to the decade, instead of enumerating them in the code.)
Solution
year = 1983 gdp_decade = 'gdpPercap_' + str(year // 10) avg = (japan.ix[gdp_decade + '2'] + japan.ix[gdp_decade + '7']) / 2
2.
def avg_gdp_in_decade(country, continent, year): df = pd.read_csv('gapminder_gdp_' + continent + '.csv', index_col=0) c = df.ix[country] gdp_decade = 'gdpPercap_' + str(year // 10) avg = (c.ix[gdp_decade + '2'] + c.ix[gdp_decade + '7'])/2 return avg
- We need to loop over the reported years to obtain the average for the relevant ones in the data.
def avg_gdp_in_decade(country, continent, year): df = pd.read_csv('gapminder_gdp_' + continent + '.csv', index_col=0) c = df.ix[country] gdp_decade = 'gdpPercap_' + str(year // 10) total = 0.0 num_years = 0 for yr_header in c.index: # c's index contains reported years if yr_header.startswith(gdp_decade): total = total + c.ix[yr_header] num_years = num_years + 1 return total/num_years
Key Points
Break programs down into functions to make them easier to understand.
Define a function using
def
with a name, parameters, and a block of code.Defining a function does not run it.
Arguments in call are matched to parameters in definition.
Functions may return a result to their caller using
return
.