python函数如何使用
下面这个例子将说明这事实上是十分简单的:
例7.1 定义函数
def sayhello():
print "hello world!"
sayhello()
(源文件:code/function1.py)
输出
$ python function1.py
hello world!
它如何工作
我们使用上面解释的语法定义了一个称为sayhello的函数。这个函数不使用任何参数,因此在圆括号中没有声明任何变量。参数对于函数而言,只是给函数的输入,以便于我们可以传递不同的值给函数,然后得到相应的结果。
函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情。这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值。
参数在函数定义的圆括号对内指定,用逗号分割。当我们调用函数的时候,我们以同样的方式提供值。注意我们使用过的术语——函数中的参数名称为 形参 而你提供给函数调用的值称为 实参 。
例7.2 使用函数形参
def printmax(a, b):
if a > b:
print a, "is maximum"
else:
print b, "is maximum"
printmax(3, 4)
x = 5
y = 7
printmax(x, y)
(源文件:code/func_param.py)
输出
$ python func_param.py
4 is maximum
7 is maximum
它如何工作
这里,我们定义了一个称为printmax的函数,这个函数需要两个形参,叫做a和b。我们使用if..else语句找出两者之中较大的一个数,并且打印较大的那个数。
在第一个printmax使用中,我们直接把数,即实参,提供给函数。PC.ZX98.com在第二个使用中,我们使用变量调用函数。printmax(x, y)使实参x的值赋给形参a,实参y的值赋给形参b。在两次调用中,printmax函数的工作完全相同。
当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。
例7.3 使用局部变量
def func(x):
print "x is", x
x = 2
print "changed local x to", x
x = 50
func(x)
print "x is still", x
(源文件:code/func_local.py)
输出
$ python func_local.py
x is 50
changed local x to 2
x is still 50
它如何工作
在函数中,我们第一次使用x的 值 的时候,python使用函数声明的形参的值。
接下来,我们把值2赋给x。x是函数的局部变量。所以,当我们在函数内改变x的值的时候,在主块中定义的x不受影响。
在最后一个print语句中,我们证明了主块中的x的值确实没有受到影响。
如果你想要为一个定义在函数外的变量赋值,那么你就得告诉python这个变量名不是局部的,而是 全局 的。我们使用global语句完成这一功能。没有global语句,是不可能为定义在函数外的变量赋值的。
你可以使用定义在函数外的变量的值(假设在函数内没有同名的变量)。然而,我并不鼓励你这样做,并且你应该尽量避免这样做,因为这使得程序的读者会不清楚这个变量是在哪里定义的。使用global语句可以清楚地表明变量是在外面的块定义的。
例7.4 使用global语句
def func():
global x
print "x is", x
x = 2
print "changed local x to", x
x = 50
func()
print "value of x is", x
(源文件:code/func_global.py)
输出
$ python func_global.py
x is 50
changed global x to 2
value of x is 2
它如何工作
global语句被用来声明x是全局的——因此,当我们在函数内把值赋给x的时候,这个变化也反映在我们在主块中使用x的值的时候。
你可以使用同一个global语句指定多个全局变量。例如global x, y, z。
对于一些函数,你可能希望它的一些参数是 可选 的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。这个功能借助于默认参数值完成。你可以在函数定义的形参名后加上赋值运算符(=)和默认值,从而给形参指定默认参数值。
注意,默认参数值应该是一个参数。更加准确的说,默认参数值应该是不可变的——这会在后面的章节中做详细解释。从现在开始,请记住这一点。
例7.5 使用默认参数值
def say(message, times = 1):
print message * times
say("hello")
say("world", 5)
(源文件:code/func_default.py)
输出
$ python func_default.py
hello
worldworldworldworldworld
它如何工作
名为say的函数用来打印一个字符串任意所需的次数。如果我们不提供一个值,那么默认地,字符串将只被打印一遍。我们通过给形参times指定默认参数值1来实现这一功能。
在第一次使用say的时候,我们只提供一个字符串,函数只打印一次字符串。在第二次使用say的时候,我们提供了字符串和参数5,表明我们想要 说 这个字符串消息5遍。
重要
只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。
这是因为赋给形参的值是根据位置而赋值的。例如,def func(a, b=5)是有效的,但是def func(a=5, b)是 无效 的。
如果你的某个函数有许多参数,而你只想指定其中的一部分,那么你可以通过命名来为这些参数赋值——这被称作 关键参数 ——我们使用名字(关键字)而不是位置(我们前面所一直使用的方法)来给函数指定实参。
这样做有两个 优势 ——一,由于我们不必担心参数的顺序,使用函数变得更加简单了。二、假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值。
例7.6 使用关键参数
def func(a, b=5, c=10):
print "a is", a, "and b is", b, "and c is", c
func(3, 7)
func(25, c=24)
func(c=50, a=100)
(源文件:code/func_key.py)
输出
$ python func_key.py
a is 3 and b is 7 and c is 10
a is 25 and b is 5 and c is 24
a is 100 and b is 5 and c is 50
它如何工作
名为func的函数有一个没有默认值的参数,和两个有默认值的参数。
在第一次使用函数的时候, func(3, 7),参数a得到值3,参数b得到值7,而参数c使用默认值10。
在第二次使用函数func(25, c=24)的时候,根据实参的位置变量a得到值25。根据命名,即关键参数,参数c得到值24。变量b根据默认值,为5。
在第三次使用func(c=50, a=100)的时候,我们使用关键参数来完全指定参数值。注意,尽管函数定义中,a在c之前定义,我们仍然可以在a之前指定参数c的值。