面向非程序员的 Python 3 教程/定义函数
为了开始本章,我将给你一个你可以做但你不应该做的例子(所以不要把它输入进去)
a = 23
b = -23
if a < 0:
a = -a
if b < 0:
b = -b
if a == b:
print("The absolute values of", a, "and", b, "are equal.")
else:
print("The absolute values of", a, "and", b, "are different.")
输出为
The absolute values of 23 and 23 are equal.
这个程序看起来有点重复。程序员讨厌重复的事情——毕竟,这就是计算机存在的意义!(还要注意,求绝对值改变了变量的值,这就是为什么输出中打印的是 23,而不是 -23。)幸运的是,Python 允许你创建函数来消除重复。以下是重写的示例
a = 23
b = -23
def absolute_value(n):
if n < 0:
n = -n
return n
if absolute_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.")
输出为
The absolute values of 23 and -23 are equal.
这个程序的关键特征是 def
语句。def
(定义的缩写)开始一个函数定义。def
后面跟着函数名 absolute_value
。接下来是一个 '(',后面跟着参数 n
(当函数被调用时,n
从程序传递到函数)。冒号后面的语句在使用函数时执行。这些语句一直持续到缩进的语句结束或遇到 return
。return
语句将一个值返回到调用函数的地方。我们已经在第一个程序中遇到了一个函数,即 print
函数。现在我们可以创建新的函数了。
注意 a
和 b
的值没有改变。函数可以用来重复不返回值的任务。以下是一些示例
def hello():
print("Hello")
def area(width, height):
return width * height
def print_welcome(name):
print("Welcome", name)
hello()
hello()
print_welcome("Fred")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))
输出为
Hello Hello Welcome Fred width = 4 height = 5 area = 20
这个例子展示了你可以用函数做的一些事情。注意你可以使用 0 个参数或 2 个或更多参数。还要注意,当函数不需要返回一个值时,返回是可选的。
在消除重复代码时,你经常在重复代码中使用变量。在 Python 中,这些变量以一种特殊的方式处理。到目前为止,我们看到的所有变量都是全局变量。函数有一种特殊的变量类型,称为局部变量。这些变量只在函数运行时存在。当局部变量与另一个变量(例如全局变量)同名时,局部变量会隐藏另一个变量。听起来很混乱吗?好吧,以下这些例子(有点牵强)应该能帮助你弄清楚。
a = 4
def print_func():
a = 17
print("in print_func a =", a)
print_func()
print("a = ", a)
运行后,我们将收到以下输出
in print_func a = 17 a = 4
函数内部的变量赋值不会覆盖全局变量,它们只在函数内部存在。即使 a
在函数内部被赋予了一个新值,这个新赋值的值只对 print_func
有效,当函数运行结束,a
的值再次被打印,我们看到的是最初赋值的值。
以下是一个更复杂的例子。
a_var = 10
b_var = 15
e_var = 25
def a_func(a_var):
print("in a_func a_var =", a_var)
b_var = 100 + a_var
d_var = 2 * a_var
print("in a_func b_var =", b_var)
print("in a_func d_var =", d_var)
print("in a_func e_var =", e_var)
return b_var + 10
c_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)
输出
in a_func a_var = 15 in a_func b_var = 115 in a_func d_var = 30 in a_func e_var = 25 a_var = 10 b_var = 15 c_var = 125 d_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
在这个例子中,变量 a_var
、b_var
和 d_var
在 a_func
函数内部都是局部变量。在执行语句 return b_var + 10
之后,它们都将不再存在。变量 a_var
自动成为局部变量,因为它是一个参数名。变量 b_var
和 d_var
是局部变量,因为它们出现在函数中语句 b_var = 100 + a_var
和 d_var = 2 * a_var
中等号的左侧。
在函数内部,a_var
没有被赋值。当函数被调用时,使用 c_var = a_func(b_var)
,15 被分配给 a_var
,因为此时 b_var
为 15,这使得对函数的调用 a_func(15)
。这最终将 a_var
设置为 15,当它在 a_func
内部时。
如你所见,一旦函数运行结束,隐藏了同名全局变量的局部变量 a_var
和 b_var
就消失了。然后语句 print("a_var = ", a_var)
打印值 10
而不是值 15
,因为隐藏全局变量的局部变量已经消失了。
另一件需要注意的是最后发生的 NameError
。这似乎是因为变量 d_var
不再存在,因为 a_func
已经结束。所有局部变量都在函数退出时被删除。如果你想从函数中获取东西,那么你必须使用 return something
。
最后要注意的是,e_var
的值在 a_func
内部保持不变,因为它不是一个参数,它从未出现在 a_func
函数内部等号的左侧。当全局变量在函数内部被访问时,它来自外部的全局变量。
函数允许局部变量,这些变量只存在于函数内部,并且可以隐藏函数外部的其他变量。
temperature2.py
#! /usr/bin/python
#-*-coding: utf-8 -*-
# converts temperature to Fahrenheit or Celsius
def print_options():
print("Options:")
print(" 'p' print options")
print(" 'c' convert from Celsius")
print(" 'f' convert from Fahrenheit")
print(" 'q' quit the program")
def celsius_to_fahrenheit(c_temp):
return 9.0 / 5.0 * c_temp + 32
def fahrenheit_to_celsius(f_temp):
return (f_temp - 32.0) * 5.0 / 9.0
choice = "p"
while choice != "q":
if choice == "c":
c_temp = float(input("Celsius temperature: "))
print("Fahrenheit:", celsius_to_fahrenheit(c_temp))
choice = input("option: ")
elif choice == "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 inputed
print_options()
choice = input("option: ")
示例运行
Options: 'p' print options 'c' convert from celsius 'f' convert from fahrenheit 'q' quit the program option: c Celsius temperature: 30 Fahrenheit: 86.0 option: f Fahrenheit temperature: 60 Celsius: 15.5555555556 option: q
area2.py
#! /usr/bin/python
#-*-coding: utf-8 -*-
# calculates a given rectangle area
def hello():
print('Hello!')
def area(width, height):
return width * height
def print_welcome(name):
print('Welcome,', name)
def positive_input(prompt):
number = float(input(prompt))
while number <= 0:
print('Must be a positive number')
number = float(input(prompt))
return number
name = 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))
示例运行
Your Name: Josh Hello! Welcome, Josh To find the area of a rectangle, enter the width and height below. Width: -4 Must be a positive number Width: 4 Height: 3 Width = 4 Height = 3 so Area = 12
重写上面示例中的 area2.py 程序,使其包含一个单独的函数来计算正方形的面积、矩形的面积和圆形的面积(3.14 * radius**2
)。这个程序应该包含一个菜单界面。
def square(L):
return L * L
def rectangle(width , height):
return width * height
def circle(radius):
return 3.14159 * radius ** 2
def options():
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()
while choice != "q":
choice = input("Please enter your choice: ")
if choice == "s":
L = float(input("Length of square side: "))
print("The area of this square is", square(L))
options()
elif choice == "c":
radius = float(input("Radius of the circle: "))
print("The area of the circle is", circle(radius))
options()
elif choice == "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()
elif choice == "q":
print(" ",end="")
else:
print("Unrecognized option.")
options()