A function is a block (piece) of code, with a unique name and maybe, takes some data, that performs a specific task (computes on the data). The use of functions prevents one from repeating a particular piece of routine/procedure/process over and over again.
Let say we want to ask a user five names and print them out with some string.
some_str = "$"
first_name = input("Enter first name: ")
print(first_name + some_str)
second_name = input("Enter second name: ")
print(second_name + some_str)
third_name = input("Enter third name: ")
print(third_name + some_str)
fourth_name = input("Enter fourth name: ")
print(fourth_name + some_str)
fifth_name = input("Enter fifth name: ")
print(fifth_name + some_str)
The code above works well, we achieved our goal but we waisted a lot of time rewriting all these (input and output) for five times. One of the solutions would be to use a loop.
A snippet that asks a user for five names and prints them out with some string.
some_str = "$"
for i in range(5):
name = input("Enter name: ")
print(name + some_str) # str concat
Well, this code also works well. The problem is that, what if we want it multiple times, perhaps at different parts of our code? What about in another file? Of course, one would say, copy and paste it. There is better.
Now another approach is the modular (functional) approach.
Let's see how to create a function.
def function_name():
# code
The def
keyword is used to define a function, followed by a function name, function_name
. The function takes at least zero arguments (data) in parenthesis, followed by a colon, :
which indicates the function block. Know that a function name should not be a python keyword, a builtin function or a class name.
Let's create a function to read and output 5 names by calling the function 5 times. In this situation, we have bundled the input and output as one.
def get_and_print_name():
some_str = "foo"
person_name = input("Enter name: ")
print(person_name + some_str)
# to make this function work, we have to call it just
# as we do to variables but here we add `()` to it.
# Do you remember print() and input()? These are all
# function calls.
get_and_print_name()
get_and_print_name()
get_and_print_name()
get_and_print_name()
get_and_print_name()
# well isn't there some repetition here? Yes, there is.
# or we can use a loop
for i in range(5):
get_and_print_name()
A program that calculates and prints the area
of a triangle taking the base
and height
as inputs.
def calc_area():
base = float(input("Enter base: "))
height = float(input("Enter height: "))
area = 0.5 * base * height
print(
f"The area of a triagle of base, {base} and height, {height} is {area}")
# function call
calc_area()
An argument is a value (some times a reference of the value) we pass to a function so that the function compute upon it. Think of an argument as data that you feed into the function for some computation.
We can discuss this snippet:
def get_and_print_name():
some_str = "foo"
name = input("Enter name: ")
print(name + some_str)
We can make it better by passing the name as an argument to the function instead of taking it as input from the user when the program is running.
We need to modify get_and_print_name
to take an argument.
def function_name(<param1>, <param2>, <...>):
# code
Parameters dictate how we would pass data (argument) to the function when we call it. <param1>, <param2>, <...>
are the parameters the function expects. It could be just one or none.
Modification of get_and_print_name
. We shall pass a parameter of name
instead, indicating the name, previously accepted as input.
def get_and_print_name(name):
some_str = " foo"
print(name + some_str)
get_and_print_name('John Doe')
A better version of the calc_area
code would be that we can pass argument (data) to it just as we did above. It will be better when we can dictate what the base or height can be. With this, we can modify the functionality of the function to return a particular area based on the arguments (data) passed.
# A program that calculates and prints the area of a
# triangle passing the base and height as arguments
def calc_area(base, height):
area = 0.5 * base * height
print(
f"The area of a triagle of base, {base} and height, {height} is {area}m^2")
# take the base and height from the user
base = float(input("Enter base: "))
height = float(input("Enter height: "))
# call the function here
calc_area(base, height)
When we create a function, the placeholders for the data that the function may need is what we call the parameter. If we look at the code above in Example 6
, the parameters are base
and height
- meaning, the function would need two data to compute upon. Now, when we want to make use of the function, call the function, we pass the required data as argument.
def calc_area(base, height):
# code
calc_area(3, 4)
base
andheight
indef calc_area(base, height)
are parameters3
and4
are arguments- we can assign
3
and4
to variables and pass these variables as arguments instead.
def calc_area(base, height):
# code
base = 3
height = 4
calc_area(base, height)
- Reduce code redundancy
- It is easier to catch and fix a bug in our code
- It can be plugged into another code