To start off this chapter I am going to give you an example of what you could do but shouldn't (so don't type it in):
a=23b=-23ifa<0:a=-aifb<0:b=-bifa==b:print("The absolute values of",a,"and",b,"are equal.")else:print("The absolute values of",a,"and",b,"are different.")
with the output being:
The absolute values of 23 and 23 are equal.
The program seems a little repetitive. Programmers hate to repeat things -- that's what computers are for, after all! (Note also that finding the absolute value changed the value of the variable, which is why it is printing out 23, and not -23 in the output.) Fortunately Python allows you to create functions to remove duplication. Here is the rewritten example:
a=23b=-23defabsolute_value(n):ifn<0:n=-nreturnnifabsolute_value(a)==absolute_value(b):print("The absolute values of",a,"and",b,"are equal.")else:print("The absolute values of",a,"and",b,"are different.")
with the output being:
The absolute values of 23 and -23 are equal.
The key feature of this program is thedef
statement.def
(short for define) starts a function definition.def
isfollowed by the name of the functionabsolute_value
. Next comes a '(' followed by the parametern
(n
is passed from the program into the function when the function is called). The statements after the ':' are executed when the function is used. The statements continue until either the indented statements end or areturn
is encountered. Thereturn
statement returns a value back to the place where the function was called. We already have encountered a function in our very first program, theprint
function. Now we can make new functions.
Notice how the values ofa
andb
are not changed.Functions can be used to repeat tasks that don't returnvalues. Here are some examples:
defhello():print("Hello")defarea(width,height):returnwidth*heightdefprint_welcome(name):print("Welcome",name)hello()hello()print_welcome("Fred")w=4h=5print("width =",w," height =",h," area =",area(w,h))
with output being:
HelloHelloWelcome Fredwidth = 4 height = 5 area = 20
That example shows some more stuff that you can do withfunctions. Notice that you can use no arguments or two or more.Notice also when a function doesn't need to send back a value, areturn is optional.
When eliminating repeated code, you often have variables in the repeated code. In Python, these are dealt with in a special way. So far all variables we have seen are global variables. Functions have a special type of variable called local variables. These variables only exist while the function is running. When a local variable has the same name as another variable (such as a global variable), the local variable hides the other. Sound confusing? Well, these next examples (which are a bit contrived) should help clear things up.
a=4defprint_func():a=17print("in print_func a =",a)print_func()print("a = ",a)
When run, we will receive an output of:
in print_func a = 17a = 4
Variable assignments inside a function do not override global variables, they exist only inside the function. Even thougha
was assigned a new value inside the function, this newly assigned value was only relevant toprint_func
, when the function finishes running, and thea
's values is printed again, we see the originally assigned values.
Here is another more complex example.
a_var=10b_var=15e_var=25defa_func(a_var):print("in a_func a_var =",a_var)b_var=100+a_vard_var=2*a_varprint("in a_func b_var =",b_var)print("in a_func d_var =",d_var)print("in a_func e_var =",e_var)returnb_var+10c_var=a_func(b_var)print("a_var =",a_var)print("b_var =",b_var)print("c_var =",c_var)print("d_var =",d_var)
output:
in a_func a_var = 15in a_func b_var = 115in a_func d_var = 30in a_func e_var = 25a_var = 10b_var = 15c_var = 125d_var = Traceback (most recent call last): File "C:\def2.py", line 19, in <module> print("d_var = ", d_var)NameError: name 'd_var' is not defined
In this example the variablesa_var
,b_var
, andd_var
are all local variables when they are inside the functiona_func
. After the statementreturn b_var + 10
is run, they all cease to exist. The variablea_var
is automatically a local variable since it is a parameter name. The variablesb_var
andd_var
are local variables since they appear on the left of an equals sign in the function in the statementsb_var = 100 + a_var
andd_var = 2 * a_var
.
Inside of the functiona_var
has no value assigned to it. When the function is called withc_var = a_func(b_var)
, 15 is assigned toa_var
since at that point in timeb_var
is 15, making the call to the functiona_func(15)
. This ends up settinga_var
to 15 when it is inside ofa_func
.
As you can see, once the function finishes running, the local variablesa_var
andb_var
that had hidden the global variables of the same name are gone. Then the statementprint("a_var = ", a_var)
prints the value10
rather than the value15
since the local variable that hid the global variable is gone.
Another thing to notice is theNameError
that happens at the end. This appears since the variabled_var
no longer exists sincea_func
finished. All the local variables are deleted when the function exits. If you want to get something from a function, then you will have to usereturn something
.
One last thing to notice is that the value ofe_var
remains unchanged insidea_func
since it is not a parameter and it never appears on the left of an equals sign inside of the functiona_func
. When a global variable is accessed inside a function it is the global variable from the outside.
Functions allow local variables that exist only inside the function and can hide other variables that are outside the function.
temperature2.py
#! /usr/bin/python#-*-coding: utf-8 -*-# converts temperature to Fahrenheit or Celsiusdefprint_options():print("Options:")print(" 'p' print options")print(" 'c' convert from Celsius")print(" 'f' convert from Fahrenheit")print(" 'q' quit the program")defcelsius_to_fahrenheit(c_temp):return9.0/5.0*c_temp+32deffahrenheit_to_celsius(f_temp):return(f_temp-32.0)*5.0/9.0choice="p"whilechoice!="q":ifchoice=="c":c_temp=float(input("Celsius temperature: "))print("Fahrenheit:",celsius_to_fahrenheit(c_temp))choice=input("option: ")elifchoice=="f":f_temp=float(input("Fahrenheit temperature: "))print("Celsius:",fahrenheit_to_celsius(f_temp))choice=input("option: ")else:choice="p"#Alternatively choice != "q": so that print#when anything unexpected inputedprint_options()choice=input("option: ")
Sample Run:
Options: 'p' print options 'c' convert from celsius 'f' convert from fahrenheit 'q' quit the programoption:cCelsius temperature:30 Fahrenheit: 86.0option:fFahrenheit temperature:60Celsius: 15.5555555556option:q
area2.py
#! /usr/bin/python#-*-coding: utf-8 -*-# calculates a given rectangle areadefhello():print('Hello!')defarea(width,height):returnwidth*heightdefprint_welcome(name):print('Welcome,',name)defpositive_input(prompt):number=float(input(prompt))whilenumber<=0:print('Must be a positive number')number=float(input(prompt))returnnumbername=input('Your Name: ')hello()print_welcome(name)print()print('To find the area of a rectangle,')print('enter the width and height below.')print()w=positive_input('Width: ')h=positive_input('Height: ')print('Width =',w,' Height =',h,' so Area =',area(w,h))
Sample Run:
Your Name:JoshHello!Welcome, JoshTo find the area of a rectangle,enter the width and height below.Width:-4Must be a positive numberWidth:4Height:3Width = 4 Height = 3 so Area = 12
Rewrite the area2.py program from the Examples above to have a separate function for the area of a square, the area of a rectangle, and the area of a circle (3.14 * radius**2
). This program should include a menu interface.
defsquare(L):returnL*Ldefrectangle(width,height):returnwidth*heightdefcircle(radius):return3.14159*radius**2defoptions():print()print("Options:")print("s = calculate the area of a square.")print("c = calculate the area of a circle.")print("r = calculate the area of a rectangle.")print("q = quit")print()print("This program will calculate the area of a square, circle or rectangle.")choice="x"options()whilechoice!="q":choice=input("Please enter your choice: ")ifchoice=="s":L=float(input("Length of square side: "))print("The area of this square is",square(L))options()elifchoice=="c":radius=float(input("Radius of the circle: "))print("The area of the circle is",circle(radius))options()elifchoice=="r":width=float(input("Width of the rectangle: "))height=float(input("Height of the rectangle: "))print("The area of the rectangle is",rectangle(width,height))options()elifchoice=="q":print(" ",end="")else:print("Unrecognized option.")options()
Non-Programmer's Tutorial for Python 3 | ||
← Debugging | Defining Functions | Advanced Functions Example → |