python基础===函数的几个要点

函数

 

可接受任意数量参数的函数

位置参数   和  关键字参数

为了能让一个函数接受任意数量的位置参数,可以使用一个*参数.

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接受未赋值的参数, 然后跟之前已经赋值过的参数合并起来,最后将所有参数传递给原始函数。

 

posted @ 2018-03-28 17:17  botoo  阅读(417)  评论(0编辑  收藏  举报