创建函数

为了开始本章,我将给你一个例子,展示你可以做的事情,但不应该这么做(所以不要输入这段代码):

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 函数。现在,我们可以创建新的函数了。

注意,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

这个例子展示了你可以使用函数做的一些事情。注意,你可以使用没有参数的函数,也可以使用有两个或更多参数的函数。还要注意,当一个函数不需要返回值时,return 是可选的。

函数中的变量

在消除重复代码时,你经常会遇到在重复代码中使用的变量。在 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 并没有覆盖全局变量 a,它们仅存在于 print_func 函数内部。尽管 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_var 都是 a_func 函数内部的局部变量。执行完 return b_var + 10 语句后,它们都不再存在。变量 a_var 自动成为局部变量,因为它是一个参数名。b_vard_var 是局部变量,因为它们出现在函数内部的赋值语句中:b_var = 100 + a_vard_var = 2 * a_var

在函数内部,a_var 没有值被赋予。调用 a_func(b_var) 时,b_var 的值是 15,所以将 15 赋值给 a_var,从而使 a_var 在函数内部变为 15。

正如你所看到的,当函数执行完毕后,局部变量 a_varb_var 被删除,因此在输出 a_var = 10 时显示的是全局变量 a_var 的值,而不是函数内的局部值 15。

另一个需要注意的是最后的 NameError,因为 d_var 在函数执行完毕后已经不再存在。所有局部变量都会在函数退出时被删除。如果你想从函数中获取某个值,就必须使用 return 语句返回一个值。

最后要注意的是,变量 e_var 在函数内部保持不变,因为它既不是参数,也没有出现在函数内部的赋值语句中。当在函数内部访问全局变量时,访问的是外部的全局变量。

函数允许局部变量仅在函数内部存在,并且可以隐藏外部的同名变量。

示例

temperature2.py

#! /usr/bin/python
#-*-coding: utf-8 -*-
# 转换温度为华氏度或摄氏度

def print_options():
    print("选项:")
    print(" 'p' 打印选项")
    print(" 'c' 从摄氏度转换")
    print(" 'f' 从华氏度转换")
    print(" 'q' 退出程序")

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("摄氏温度:"))
        print("华氏度:", celsius_to_fahrenheit(c_temp))
        choice = input("选项:")
    elif choice == "f":
        f_temp = float(input("华氏温度:"))
        print("摄氏度:", fahrenheit_to_celsius(f_temp))
        choice = input("选项:")
    else:
        choice = "p"  # 如果输入其他内容则打印选项
        print_options()
        choice = input("选项:")

示例运行:

选项:
 'p' 打印选项
 'c' 从摄氏度转换
 'f' 从华氏度转换
 'q' 退出程序
选项:c
摄氏温度:30
华氏度: 86.0
选项:f
华氏温度:60
摄氏度: 15.5555555556
选项:q

area2.py

#! /usr/bin/python
#-*-coding: utf-8 -*-
# 计算给定矩形的面积

def hello():
    print('你好!')

def area(width, height):
    return width * height

def print_welcome(name):
    print('欢迎,', name)

def positive_input(prompt):
    number = float(input(prompt))
    while number <= 0:
        print('必须是一个正数')
        number = float(input(prompt))
    return number

name = input('你的名字:')
hello()
print_welcome(name)
print()
print('要计算矩形的面积,')
print('请输入宽度和高度。')
print()
w = positive_input('宽度:')
h = positive_input('高度:')

print('宽度 =', w, ' 高度 =', h, ' 所以面积 =', area(w, h))

示例运行:

你的名字:Josh
你好!
欢迎, Josh

要计算矩形的面积,
请输入宽度和高度。

宽度:-4
必须是一个正数
宽度:4
高度:3
宽度 = 4  高度 = 3  所以面积 = 12

最后修改: 2025年02月2日 星期日 21:16