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
这个例子展示了你可以使用函数做的一些事情。注意,你可以使用没有参数的函数,也可以使用有两个或更多参数的函数。还要注意,当一个函数不需要返回值时,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_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
没有值被赋予。调用 a_func(b_var)
时,b_var
的值是 15,所以将 15 赋值给 a_var
,从而使 a_var
在函数内部变为 15。
正如你所看到的,当函数执行完毕后,局部变量 a_var
和 b_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