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" 

注意:

一个*参数只能出现在函数定义中最后一个位置参数后面,而 **参数只能出现在最后一个参数。 有一点要注意的是,在*参数后面仍然可以定义其他参数。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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!
    ...

因为会出现这样的错误:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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 @ 2022-10-07 20:29  I'm_江河湖海  阅读(2)  评论(0编辑  收藏  举报