Python Formal Parameter and Argument
23 Aug 2013首先, 我们定义一个函数:
def f(name = 2, *arguments, **keywords):
print name
print arguments
print keywords
三种 Argument (实参)
-
Default Argument
f(), 传入了一个 Default Argument, name 的值为定义函数 f 时指定的 2.
-
Positional Argument
f(4), 传入一个 Positional Argument, name 的值为 4.
-
Keyword Argument
f(name = 24), 传入一个 Keyword Argument, name 的值为 24.
同一个 Argument 只能被赋值一次:
f(4, name = 24)
这条语句非法, 因为 name 被赋值了两次, 第一次是 Positional Argument, 第二次是 Keyword Argument.
Keyword Argument 必须接在 Positional Argument 的后面, 下面一条语句非法:
f(name = 24, 4)
三种 Formal Parameter (形参)
-
形如 name
最普通的形参, 不解释.
-
形如 *arguments
这种类型的形参就像个收容所, 收容那些没有匹配成功的 Positional Argument, 其值为没匹配成功的 Positional Argument 组成的 Tuple.
f(4, 5, 6, k = 7)
4 与 name 相匹配, k = 7 是 Keyword Argument, 所以最终的值为 (5, 6).
一个函数定义中只能有一个这样的形参, 且无法用 Default Argument 来赋值, 下面两个函数都是非法的:
def foo(*args1, *args2): pass def bar(*args = (2, 4)): pass
那么我们可不可以通过 Keyword Argument 来传参呢, 例如:
f(arguments = (2, 4))
上面这条语句并不会报错, 但是你会发现 arguments 的值仍然为 (), 空的 Tuple, 为什么会这样呢? 这和下面一种 Parameter 有关.
-
形如 **keywords
这种 Parameter 和上面一种差不多, 只不过它收容的是所有未匹配成功的 Keyword Argument, 其值为没匹配成功的 Keyword Argument 组成的 Dictionary.
f(name = 24, m = 2, d = 4)
name = 24 与 name 相匹配, 所以 keywords 的值为 {‘m’: 2, ‘d’: 4}
同样的, 一个函数中也只能有一个这样的形参, 我们也无法通过 Default Argument 为其赋值. 还记得 f(arguments = (2, 4)) 这条语句么? arguments 之所以为空 Tuple, 是因为 arguments 被 keywords 给”强制收容”了, keywords 的值为 {‘arguments’: (2, 4)}. 那么 f(keywords = {‘m’: 2, ‘d’: 4}) 呢? 自己试试看吧.