跳转到内容

面向非程序员的 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 语句将值返回到调用程序中调用函数的位置。

注意 ab 的值没有改变。函数可以用来重复不返回值的任务。以下是一些示例

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_varb_vard_var 在函数 a_func 内部都是局部变量。在 return b_var + 10 语句运行之后,它们都将不复存在。变量 a_var“自动”成为局部变量,因为它是由函数定义命名的参数。变量 b_vard_var 是局部变量,因为它们出现在函数内部语句的等号左侧:b_var = 100 + a_vard_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_varb_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()


华夏公益教科书