-
用*参数接受任意数量的位置参数,用**参数接受任意数量的关键字参数,在*参数后面的参数为强制关键字参数,典型用法如下,args为序列,如列表和元组等,kwargs为字典。
def anyargs(*args, **kwargs): -
强制关键字参数:放在某个*参数后或者单个*之后。强制关键字参数的调用必须指定。好处是表意清晰,增加可读性。
def fun(*args, block=None): def fun(maxsize, *, block): # 调用: recv(1024, True) # TypeError recv(1024, block=True) # Ok -
使用函数参数注解,好处不言而喻…,函数注解只存储在函数的__annotations__属性中。
def add(x:int, y:int) -> int: return x + y -
返回多个返回值,直接return,其实就是返回了元组,另,对以下情况,我们以为是用小括号生成了元组,其实逗号才是关键。。。。
>>> a = (1, 2) # With parentheses >>> a (1, 2) >>> b = 1, 2 # Without parentheses >>> b (1, 2) -
函数的默认参数,都会。
- 需要注意的是,如果默认参数是一个可修改的容器比如一个列表、集合或者字典,可使用None作为默认值,但是千万不能使用[]这种,因为默认参数的值是在函数定义时赋值一次,直接使用[]会导致调用函数时不同地方都会被修改。
- 判断None也尽量使用is,因为使用not的话,长度为0 的字符串、列表、元组、字典等都会被当做False。
def spam(a, b=[]): # NO!!! ... def spam(a, b=None): if not b: # 尽量不用not! 改成:if b is None: b = [] # 或者使用这种方式: _no_value = object() def spam(a, b=_no_value): if b is _no_value: print('No b value supplied') -
lambda函数必知必会。。需要注意的是,上面说的普通函数的默认参数是定义时绑定值,lambda函数的自由变量,是运行时绑定值,如果需要在定义时就绑定值,同样,设置成默认参数,赋初值即可。
# 运行时绑定x a = lambda y: x + y # 定义时绑定x a = lambda y, x=x: x + y # 典型例子:n运行时绑定的迭代最后的4 >>> funcs = [lambda x: x+n for n in range(5)] >>> for f in funcs: ... print(f(0)) ... 44444 >>> # n绑定的定义时的 01234 >>> funcs = [lambda x, n=n: x+n for n in range(5)] >>> for f in funcs: ... print(f(0)) ... 01234 >>> -
减少某个函数的参数个数,即把某个函数的部分参数设置一个默认值:functools.partial(),partial() 固定某些参数并返回一个新的callable对象。对某些使用单个值来调用回调函数来说,有用,或者使用lambda也能实现同样的功能。
def spam(a, b, c, d): print(a, b, c, d) # 设置一个默认值 >>> s3 = partial(spam, 1, 2, d=42) # a = 1, b = 2, d = 42 >>> s3(3) 1 2 3 42 -
灵活使用闭包,他在函数内部带上了额外的变量环境,闭包的关键特点就是他会记住自己被定义时的环境,任何时候只要你碰到需要给某个函数增加额外的状态信息的问题,都可以考虑使用闭包。
-
让回调函数访问外部信息,可用类,闭包或协程。
【Python CookBook】第七章:函数
最新推荐文章于 2025-04-13 22:50:21 发布
本文介绍了Python函数的高级用法,包括使用*和**参数接收任意数量的位置和关键字参数,强制关键字参数的调用方式,以及函数参数注解的作用。此外,还讨论了如何返回多个值、设置默认参数时避免可变容器的陷阱,以及使用is判断None的重要性。进一步讲解了lambda函数的工作原理,以及如何通过functools.partial()减少函数参数。最后,探讨了闭包的概念及其在增加函数状态信息中的应用,以及回调函数如何访问外部信息的多种方法。

514

被折叠的 条评论
为什么被折叠?



