下面是给函数传递参数时的一些简要的关键点:python
>>> def f(a): ... a = 99 ... >>> b = 88 >>> f(b) >>> print(b) 88
这里最须要记住的就是,函数可以改变传入的可变对象(例如,列表和字典),这不会是个麻烦,井且有时候这对于某些用途颇有用处。此外,原位置修改传入的可变对象的函数,多是有意面为的,例如,修改多是一个定义良好的AP的一部分,而咱们不该该经过建立复制来违反该API。
然而,你也必须意识到这个特性:若是在你没有预期的状况下外部对象发生了改变,检查一下是否是由某个被调用的函数引发的,而且有必要的话在传入对象时建立复制。web
>>> def multiple(x, y): ... x = 2 ... y = [3, 4] ... return x, y ... >>> >>> X = 1 >>> L = [1, 2] >>> X, L = multiple(X, L) >>> X, L (2, [3, 4])
看起来这段代码好像返国了两个值,可是实际上只有一个:一个包含2个元素的元组这里省略了它可选的圆括号,在调用返国后,咱们能使用元组赋值解包被返国元组的各部分。svg
匹配模式的大纲:函数
语法 | 位置 | 解释 |
---|---|---|
func(value) | 调用者 | 常规参数:经过位置匹配 |
func(name=value) | 调用者 | 关键字参数:经过名称匹配 |
func(*iterable) | 调用者 | 将 iterable中全部的对象做为独立的基于位置的参数传入 |
func(**dict) | 调用者 | 将dct中全部的键/值对做为独立的关键字参数传入 |
def func(name) | 函数 | 常规参数:经过位置或名称匹配 |
def func( name=value) | 函数 | 默认值参数值,若是没有在调用时传入的话 |
def func(*name) | 函数 | 数将剩下的基于位置的参数匹配井收集到一个元组中 |
def func(**name) | 函数 | 将剩下的关键字参数匹配并收集到一个字典中 |
def func(* other,name) | 函数 | 在调用中必须经过关键字传入的参数(仅限3X) |
def func(*, name=value) | 函数 | 在调用中必须经过关键字传入的参数(仅限3X) |
函数参数应遵循下面这些顺序规则:工具
python内部大体是使用如下的步骤来在赋值前匹配参数的:spa
>>> def f(a, b, c): print(a, b, c) ... >>> f(1, 2, 3) 1 2 3
这里,咱们基于位置传入值:a匹配到1,b匹配到2,c匹配到3;指针
关键字参数容许咱们经过名称匹配,而不是基于位置。仍是同一个函数code
>>> f(c=3, b=2, a=1) 1 2 3
简而言之,默认值参数容许咱们让特定的参数变为可选的。若是没有传入值的话,在函数运行前参数就会被赋予默认值。例如,下面是这个函数须要一个参数,另外两个参数默认:xml
>>> def f(a, b=2, c=3): print(a, b, c) ... >>> f(1) 1 2 3
>>> f(1, 4) 1 4 3
>>> f(1, c=6) 1 2 6
下面这段代码中,调用者必须老是传入至少两个参数(匹配spam和eggs),不过另外两个是可选的:对象
def func(spam, eggs, toast=0, ham=0): print(spam, eggs, toast, ham) func(1, 2) # output:(1, 2, 0, 0) func(1, ham=1, eggs=0) # output:(1, 0, 0, 1) func(spam=1, eggs=0) # output:(1, 0, 0, 0) func(toast=1, eggs=2, spam=3) # output:(3, 2, 1, 0) func(1, 2, 3, 4) # output:(1, 2, 3, 4)
‘*’和‘**’做为最后两种匹配的扩展,旨在让函数支持接受任意多的参数。
其中第一种用法,是在函数定义中把不能匹配的基于位置的参数收集到一个元组:
>>> def f(*args): ... print(args) ... >>> f(1, 2, 3, 4) (1, 2, 3, 4)
‘**’的特性与之相似,可是它只对关键字参数有效。他将这些关键字参数收集到一个新的字典中,这个字典以后将可以用通常的字典工具处理
>>> def f(**args):print(args) ... >>> f(a=1, b=2) {'a': 1, 'b': 2}
基于位置的解包参数:
>>> def func(a, b, c, d):print(a, b, c, d) ... >>> args = (1, 2, 3, 4) >>> func(*args) 1 2 3 4
基于关键字的解包参数:
>>> def func(a, b, c, d):print(a, b, c, d) ... >>> args = {'a': 1, 'b':s 2, 'c': 3, 'd':4} >>> >>> func(**args) 1 2 3 4
一样,能够调用时可以以很是灵活的方式混用通常参数、基于位置的参数以及关键参数:
>>> func(*(1, 2), **{'d': 4, 'c': 3}) 1 2 3 4 >>> func(1, *(2, 3), **{'d': 4}) 1 2 3 4 >>> func(1, c=3, *(2,), **{'d': 4}) 1 2 3 4 >>> func(1, *(2, 3), d=4) 1 2 3 4 >>> func(1, *(2,), c=3, **{'d': 4}) 1 2 3 4