函数
可接受任意数量参数的函数
位置参数 和 关键字参数
为了能让一个函数接受任意数量的位置参数,可以使用一个*参数.
def avg(first, *r): return (first + sum(r)) / (1 + len(r)) print(avg(1,2,3,4,5,6)) #3.5
为了接受任意数量的关键字参数,使用一个以**开头的参数。比如:
def make_element(x, **a): key = ['%s = "%s" ' % item for item in a.items()] key1 = ' '.join(key) print(key1) make_element(10, c =2,b =5,f= 20) #c = "2" b = "5" f = "20"
注意:
一个*参数只能出现在函数定义中最后一个位置参数后面,而 **参数只能出现在最后一个参数。 有一点要注意的是,在*参数后面仍然可以定义其他参数。
def a(x, *args, y): pass def b(x, *args, y, **kwargs): pass
返回多个值的函数
为了能返回多个值,函数直接return一个元组就行了。例如:
def add(x:int,y:int): return x, y, x+y a, b, c = add(1, 2) print(a) print(c)
函数返回的结果是一个元组,然后给a, b, c赋值
默认参数
默认参数的值应该是不可变的对象,比如None、True、False、数字或字符串。 特别的,千万不要像下面这样写代码:
def spam(a, b=[]): # NO! ...
因为会出现这样的错误:
>>> def spam(a, b=[]): ... print(b) ... return b ... >>> x = spam(1) >>> x [] >>> x.append(99) >>> x.append('Yow!') >>> x [99, 'Yow!'] >>> spam(1) # Modified list gets returned! [99, 'Yow!'] >>>
在测试None值时使用 is
操作符是很重要的,也是这种方案的关键点。因此应该这样写:
def spam(a, b=None): if b is None: b = [] ...
减少可调用对象的参数个数
如果需要减少某个函数的参数个数,你可以使用 functools.partial()
。 partial()
函数允许你给一个或多个参数设置固定的值,减少接下来被调用时的参数个数。 为了演示清楚,假设你有下面这样的函数:
def spam(a, b, c, d): print(a, b, c, d)
>>> from functools import partial >>> s1 = partial(spam, 1) # a = 1 >>> s1(2, 3, 4) 1 2 3 4 >>> s1(4, 5, 6) 1 4 5 6 >>> s2 = partial(spam, d=42) # d = 42 >>> s2(1, 2, 3) 1 2 3 42 >>> s2(4, 5, 5) 4 5 5 42 >>> s3 = partial(spam, 1, 2, d=42) # a = 1, b = 2, d = 42 >>> s3(3) 1 2 3 42 >>> s3(4) 1 2 4 42 >>> s3(5) 1 2 5 42 >>>
可以看出 partial()
固定某些参数并返回一个新的callable对象。这个新的callable接受未赋值的参数, 然后跟之前已经赋值过的参数合并起来,最后将所有参数传递给原始函数。