@songying
2018-07-28T12:53:20.000000Z
字数 1323
阅读 1632
python函数
def 函数名(参数列表):
函数体
python 函数的参数传递:
- 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。
- 可变类型:类似 c++ 的引用传递,如 列表,字典。
《流畅的python》8.4
在Python中,唯一支持的参数传递模式是共享传参。共享传参指函数的各个形式参数获得实参中各个引用的副本。也就是说,函数内部的形参是实参的别名。
这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换成另一个对象)。
除非这个方法确实想修改通过参数传入的对象,否则在类中直接把参数赋值给
实例变量之前一定要三思,因为这样会为参数对象创建别名。如果不确定,那就创建
副本。这样客户会少些麻烦。
调用函数时可使用的正式参数类型:必需参数, 关键字参数, 默认参数, 不定长参数
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
func( arg = "args" )
x = 42
>>> def spam(a, b=x):
... print(a, b)
>>> spam(1)
1 42
>>> x = 23 # Has no effect
>>> spam(1)
1 42
def spam(a, b=[]): # NO!
def func( arg1, arg2 = 35 ):
# statement
*arg, **kwargs
*args
表示任何多个无名参数,它本质是一个tuple; **kwargs
表示关键字参数,它本质上是一个dict; *args
和**kwargs
时,必须*args参数列要在**kwargs
前。
def tag(name, *arg, cls=None, **kwargs)
使用这个函数时,所有位置参数会被放到 args 元组中,所有关键字参数会被放到字典 kwargs 中。
**kwargs
只能出现在最后一个参数*args
和 **kwargs
也可以和命名参数一起混着用。命名参数首先获得参数值,然后所有的其他参数都传递给 *args
和 **kwargs
.
def recv(maxsize, *arg, block):
此时我们block
参数必须是关键字参数。
recv(1024, True) # TypeError
recv(1024, block=True) # Ok
很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。