目录
参数让函数更有价值,在Python中,函数的参数除了上一篇博客介绍的一种方式之外,还有许多种形式。例如,用某些函数时,既可以向其传递参数,也可以不传递参数,函数依旧可以正确调用。还有一些情况,当函数中的参数数量不确定,可能是 1 个,也可能是几个、甚至几十个时,对于这些函数,应该如何定义其参数呢?本篇博文将会介绍其方法。
一、有默认值的参数
在Python中,可以在声明函数时,预先为参数设置一个默认值。当调用函数时,如果某个参数具有默认值,则可以不向函数传递该参数,这时,函数将使用声明函数时为该参数设置的默认值。
声明一个参数具有默认值的函数,格式如下:
def <函数名> (参数 = 默认值):
<语句>
-
示例:计算参数的立方值,其参数的默认值为 5
def Cube (x = 5): # 声明函数,将参数默认值设置为 5
return x ** 3
print(Cube(2)) # 调用函数,计算 2 的立方,并输出返回结果
print(Cube()) # 调用函数,计算默认参数的立方,并输出返回结果
def Cube ( x = 1,y = 2, z = 3 ): # 声明函数
return (x + y - z ) ** 3
print(Cube(0)) # 向函数传递一个值,是传递给 x
print(Cube( 3, 3)) # 向函数传递两个值,是传递给 x, y
print(Cube( , , 5)) # 这种方法是错误的
注:从上述代码可以看出,在Python中,传递参数是按照声明函数时定义的参数的顺序依次传递的。如果在调用函数时使用且仅使用 "," 表示向函数的最后一个参数传递值的话,则会引发错误。
-
示例:向指定的参数传递值
def Cube ( x = None,y = None, z = None ): # 声明函数,将参数默认值均设为 None
if x == None: # 判断参数 x 的值是否为 None,即未传递值
x = 1 # 将 x 赋值为 1,相当于参数 x 的默认值为 1
if y == None: # 判断参数 y 的值是否为 None,即未传递值
y = 2 # 将 x 赋值为 2,相当于参数 x 的默认值为 2
if z == None: # 判断参数 z 的值是否为 None,即未传递值
z = 3 # 将 x 赋值为 3,相当于参数 x 的默认值为 3
return (x + y - z ) ** 3
print(Cube()) # 调用参数,使用参数的默认值
print(Cube( None, None, 5)) # 调用函数,仅 x, y 使用默认值
二、参数的传递方式
在Python中,参数值的传递不只是按照声明函数时参数的顺序进行传递的,实际上,Python还提供了另外一种传递参数的方法——按照参数名传递值。以参数名传递参数时类似于设置参数的默认值。
使用按参数名传递参数的方式调用函数时,要在调用函数名后的圆括号里为函数的所有参数赋值,赋值的顺序不必按照函数声明时的参数顺序。
def fun ( x, y, z): # 声明函数
return x + y - z
print(fun( 1, 2, 3)) # 调用函数,按照顺序传递参数
print(fun( z =1, x = 2, y = 3)) # 调用函数,按照函数名传递参数
在Python中,调用函数可以同时使用按顺序传递参数和按照参数名传递参数两种方式。但是,需要注意的是,按顺序传递的参数要位于按参数名传递的参数之前,而且不能有重复的情况。
>>> def mysum( x, y, z): # 声明函数
... return x + y + z
...
>>> mysum ( 1, z = 3, y = 2) # 同时使用按顺序传递参数和按参数名传递参数
6
>>> mysum ( z = 3, y = 2, 1) # 错误的方式!!按照顺序传递的参数不能位于按参数名传递的参数之后
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>> mysum ( 5, z = 6, x = 7) # 错误的方式!!参数重复,5 已经传递给了 x,后边又将 7 传递给 x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: mysum() got multiple values for argument 'x'
在具有默认参数值的函数中,使用按参数名的方法非常方便。
如果使用按照参数名向函数传递参数的方法,就不必在函数声明时将参数的默认值设置为 None,可以省去函数中的判断语句。不过,为了让函数更具有通用性,在函数声明中依然将参数的默认值设置为 None。
def Cube ( x = None,y = None, z = None ): # 声明函数
if x == None:
x = 1
if y == None:
y = 2
if z == None:
z = 3
return (x + y - z ) ** 3
print(Cube(z = 5)) # 按参数名向函数中的参数 z 传递值
print(Cube( y = 6, z = 3)) # 按参数名向函数中的参数 y, z 传递值
三、如何传递任意数量的参数
在Python中,函数可以具有任意个参数,而不必在声明函数时对所有参数进行定义。使用可变长参数的函数时,其所有参数都保存在一个元组里,在函数中可以使用 for 循环来处理。声明函数时,如果在参数名前加上一个星号 "*",则表示该参数是一个可变长参数。
>>> def mylistappend( *list ): # 声明一个可变长参数的函数
... l = []
... for i in list: # 循环处理参数
... l.extend( i ) # 将所有参数中的列表合并在一起
... return l
...
>>> a = [ 1, 2, 3 ] # 定义列表
>>> b = [ 4, 5, 6 ]
>>> c = [ 7, 8, 9 ]
>>> mylistappend( a, b ) # 调用函数,传递两个参数
[1, 2, 3, 4, 5, 6]
>>> mylistappend( a, b, c ) # 调用函数,传递三个参数
[1, 2, 3, 4, 5, 6, 7, 8, 9]
四、用参数返回计算结果
在Python中,在参数中使用可变对象(如列表等),使函数中的结果返回到参数中,从而达到从函数中返回计算结果的目的。
>>> def ChangeValue1( x ): # 此处参数 x 应为整数
... x = x ** 2
...
>>> def ChangeValue2( x ): # 此处参数 x 应为列表
... x[0] = x[0] ** 2 # 第一个成员的值被改变
...
>>> a = 2 # a 为整数,其值为 2
>>> b = [2] # b 为列表,其第一个成员为 2
>>> ChangeValue1(a) # 使用函数改变 a 的值,但不成功
>>> a
2
>>> ChangeValue2(b) # 使用函数改变 b 成员的值
>>> b
[4] # 值被成功改变
>>> c = [ 2, 3]
>>> ChangeValue2(c)
>>> c
[4, 3]
>>> print(ChangeValue1(a))
None