Functions#
We have used functions is past lessons. Functions have a name and parameters. Some of them return a result, others don’t. We typically call them using result = name(parameters)
.
See also
Let’s take a look at some functions.
Example#
The function print
takes a parameter (or multiple parameters) and returns nothing:
result = print('Hello world')
result
The pow function has two parameters and returns a result:
result = pow(2, 3)
result
Custom functions#
You can DEFine your own functions using the def
statement. After the def statement, you should specify your functions’ name and in brackets its parameters. Afterwards follows a colon :
and all following lines of code which are indented are part of this function. A final return
statement sends the result back to from where the function was called.
def sum_numbers(a, b):
result = a + b
return result
You can then call your function as often as you like
sum_numbers(3, 4)
sum_numbers(5, 6)
Sometimes, you want to save the result of your function in a variable.
c = sum_numbers(4, 5)
print(c)
Simplify code using functions#
Assume you have a complicated algorithm which can tell you if a number if odd or even. Let’s put this algorithm in a function and call it later on. For our algorithm, we will use the modulo operator %.
def print_odd_or_even(number):
if number % 2 == 0:
print(number, "is even")
else:
print(number, "is odd")
print_odd_or_even(3)
print_odd_or_even(4)
print_odd_or_even(10)
Thus, instead of writing the same if-else
block again and again, we can just call our custom print_odd_or_even
function.
Documenting functions#
You can document what a function does in its so called doc string. The doc string follows right after the functions header and looks like this:
def square(number):
'''
Squares a number by multiplying it with itself and returns its result.
'''
return number * number
You can then later read the documentation of the function like this:
print(square.__doc__)
Also try this if you want to have the docstring shown side-by-side in your notebook:
square?
By the way, you can do this with any function:
import math
print(math.sqrt.__doc__)
print(math.exp.__doc__)
Exercises#
Exercise 1#
Write a function that takes two parameters: number_of_points_achieved
and number_of_total_points_in_exam
and returns a grade from 1 to 5. Students with > 95% of the points get grade 1, above 80% they get grade 2, above 60% grade 3 and above 50% grade 4. Students with less than 50% get grade 5 and have to repeat the exam. Then, call the function for three students who had 15, 25 and 29 points in an exam with 30 total points.
def grade_student_exams(number_of_points_achieved: int, number_of_total_points_in_exam: int) -> int:
percentage = number_of_points_achieved / number_of_total_points_in_exam * 100
if percentage > 95:
grade = 1
elif percentage > 80:
grade = 2
elif percentage > 60:
grade = 3
elif percentage > 50:
grade = 4
else:
grade = 5
return grade
def grade_pass_fail_exam(number_of_points_achieved: int, number_of_total_points_in_exam: int) -> bool:
grade = grade_student_exams(number_of_points_achieved, number_of_total_points_in_exam)
if grade<5:
return True
else:
return False
grade_student_exams(20, 30)
grade_pass_fail_exam(20, 30)
Exercise 2#
Write a docstring for your function that describes what it does, the input parameters it expects and the output it returns.
Explore how the Jupyter autocompletion works and inspect your grade_student_exams
function with a ?
.
grade_student_exams?
Exercise 3#
Create a function that accepts an integer number between 0 and 255 as input, generates a mask for the scipy.datasets.face
RGB image, and applies the mask to each of the 3 R, G and B indices, showing each of the three resulting images as Matplotlib plots in turn.
Hint: You can use for
loops, masking and functions for this exercise.