面向非程序员的 Python 2.6 教程 / 定义函数
为了开始本章,我将给你一个你可以做但你不应该做的例子(所以不要把它输入进去)。
a = 23
b = -23
if a < 0:
a = -a
if b < 0:
b = -b #Or use the command: elif (if+else)
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 允许你创建函数来消除重复。以下是重写的示例。
def absolute_value(n):
if n < 0:
n = -n
return n
a = 23
b = -23
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
”。参数保存从“调用”函数的程序传递给函数的值。def
语句中函数的参数必须用括号括起来。传递给函数参数的值称为参数。所以现在,参数和参数指的是同一件事。在 “:
” 后面的缩进语句块在每次使用该函数时都会被执行。函数内的语句将继续运行,直到缩进语句结束,或者遇到“return
”语句。return
语句将值返回到调用程序中调用函数的位置。
注意 a
和 b
的值没有改变。函数可以用来重复不返回值的任务。以下是一些示例
def hello():
print "Hello"
def area(w, h):
return w * h
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
该示例展示了一些你可以用函数做的更多事情。注意你可以使用一个或多个参数,或者根本不使用参数。还要注意,函数不一定需要“返回”值,所以 return
语句是可选的。
在消除重复代码时,你经常会注意到代码中重复了变量。在 Python 中,这些变量以一种特殊的方式处理。到目前为止,我们看到的所有变量都是全局变量。函数使用一种称为局部变量的特殊类型的变量。这些变量只存在于函数内部,并且只在函数运行时存在。当一个局部变量与另一个变量(如全局变量)具有相同的名称时,局部变量会隐藏另一个变量。听起来很混乱?嗯,以下这些例子(有点牵强)应该有助于澄清。
a = 4
def print_func():
a = 17
print "in print_func a = ", a
print_func()
print "a = ", a,"which is global variable assigned prior to the function print_func"
运行后,我们将收到以下输出。
in print_func a = 17 a = 4 which is global variable assigned prior to the function print_func
函数内部的变量赋值不会覆盖全局变量,它们只存在于函数内部。即使 a
在函数内部被赋值为一个新值,这个新赋值的值也只存在于 print_func
函数内部。在函数运行结束并再次打印 a
变量的值后,我们看到赋值给全局 a
变量的值被打印出来。
a_var = 10
b_var = 15
c_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 c_var = ", c_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 c_var = 25 a_var = 10 b_var = 15 c_var = 125 d_var = Traceback (most recent call last): File "C:\Python24\def2", line 19, in -toplevel- 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
语句。
最后要说明的是,c_var
的值在 a_func
内部保持不变,因为它不是参数,并且它从未出现在 a_func
函数内部等号的左侧。当在函数内部访问全局变量时,函数只使用全局变量的值,但它不能更改在函数外部分配给全局变量的值。
函数允许局部变量,这些变量只存在于函数内部,并且可以隐藏函数外部的其他变量。
temperature2.py
# 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":
temp = input("Celsius temperature: ")
print "Fahrenheit:", celsius_to_fahrenheit(temp)
elif choice == "f":
temp = input("Fahrenheit temperature: ")
print "Celsius:", fahrenheit_to_celsius(temp)
elif choice == "p":
print_options()
choice = raw_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
# By Amos Satterlee
print
def hello():
print 'Hello!'
def area(width, height):
return width * height
def print_welcome(name):
print 'Welcome,', name
name = raw_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 = input('Width: ')
while w <= 0:
print 'Must be a positive number'
w = input('Width: ')
h = input('Height: ')
while h <= 0:
print 'Must be a positive number'
h = 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
)。这个程序应该包含一个菜单界面。
将上面示例中的 area2.py 程序重写,使其分别使用一个函数来计算正方形的面积、矩形的面积和圆形的面积 (3.14 * radius ** 2
)。这个程序应该包含一个菜单界面。
def square(length):
return length * length
def rectangle(width , height):
return width * height
def circle(radius):
return 3.14 * 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 = raw_input("Please enter your choice: ")
if choice == "s":
length = input("Length of square: ")
print "The area of this square is", square(length)
options()
elif choice == "c":
radius = input("Radius of the circle: ")
print "The area of the circle is", circle(radius)
options()
elif choice == "r":
width = input("Width of the rectangle: ")
height = input("Height of the rectangle: ")
print "The area of the rectangle is", rectangle(width, height)
options()
elif choice == "q":
print "",
else:
print "Unrecognized option."
options()