[关闭]
@songying 2018-07-28T12:53:20.000000Z 字数 1323 阅读 1632

python 函数参数

python函数


函数定义

  1. def 函数名(参数列表):
  2. 函数体

可更改(mutable)与不可更改(immutable)对象

python 函数的参数传递:
- 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。
- 可变类型:类似 c++ 的引用传递,如 列表,字典。

python中的参数传递

《流畅的python》8.4
在Python中,唯一支持的参数传递模式是共享传参。共享传参指函数的各个形式参数获得实参中各个引用的副本。也就是说,函数内部的形参是实参的别名。
这种方案的结果是,函数可能会修改作为参数传入的可变对象,但是无法修改那些对象的标识(即不能把一个对象替换成另一个对象)。

除非这个方法确实想修改通过参数传入的对象,否则在类中直接把参数赋值给
实例变量之前一定要三思,因为这样会为参数对象创建别名。如果不确定,那就创建
副本。这样客户会少些麻烦。

1. 不要使用可变类型作为参数的默认值

2. 防御可变参数

关于参数

调用函数时可使用的正式参数类型:必需参数, 关键字参数, 默认参数, 不定长参数

1. 必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

2. 关键字参数

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

  1. func( arg = "args" )

3. 默认参数

  1. x = 42
  2. >>> def spam(a, b=x):
  3. ... print(a, b)
  4. >>> spam(1)
  5. 1 42
  6. >>> x = 23 # Has no effect
  7. >>> spam(1)
  8. 1 42
  1. def spam(a, b=[]): # NO!
  1. def func( arg1, arg2 = 35 ):
  2. # statement

4. 可变参数:*arg, **kwargs

  1. def tag(name, *arg, cls=None, **kwargs)

使用这个函数时,所有位置参数会被放到 args 元组中,所有关键字参数会被放到字典 kwargs 中。

强制关键字的函数

  1. def recv(maxsize, *arg, block):

此时我们block参数必须是关键字参数。

  1. recv(1024, True) # TypeError
  2. recv(1024, block=True) # Ok

很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注