跳转到内容

面向非程序员的 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 从程序传递到函数)。冒号后面的语句在使用函数时执行。这些语句一直持续到缩进的语句结束或遇到 returnreturn 语句将一个值返回到调用函数的地方。我们已经在第一个程序中遇到了一个函数,即 print 函数。现在我们可以创建新的函数了。

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

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_varb_vard_vara_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 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()


面向非程序员的 Python 3 教程
 ← 调试 定义函数 高级函数示例 → 
华夏公益教科书