【Python CookBook】第七章:函数

本文介绍了Python函数的高级用法,包括使用*和**参数接收任意数量的位置和关键字参数,强制关键字参数的调用方式,以及函数参数注解的作用。此外,还讨论了如何返回多个值、设置默认参数时避免可变容器的陷阱,以及使用is判断None的重要性。进一步讲解了lambda函数的工作原理,以及如何通过functools.partial()减少函数参数。最后,探讨了闭包的概念及其在增加函数状态信息中的应用,以及回调函数如何访问外部信息的多种方法。
  1. 用*参数接受任意数量的位置参数,用**参数接受任意数量的关键字参数,在*参数后面的参数为强制关键字参数,典型用法如下,args为序列,如列表和元组等,kwargs为字典。

    def anyargs(*args, **kwargs):
    
  2. 强制关键字参数:放在某个*参数后或者单个*之后。强制关键字参数的调用必须指定。好处是表意清晰,增加可读性。

    def fun(*args, block=None):
    def fun(maxsize, *, block):
    
    # 调用:
    recv(1024, True) # TypeError
    recv(1024, block=True) # Ok
    
  3. 使用函数参数注解,好处不言而喻…,函数注解只存储在函数的__annotations__属性中。

    def add(x:int, y:int) -> int:
    	return x + y
    
  4. 返回多个返回值,直接return,其实就是返回了元组,另,对以下情况,我们以为是用小括号生成了元组,其实逗号才是关键。。。。

    >>> a = (1, 2) # With parentheses
    >>> a
    (1, 2)
    >>> b = 1, 2 # Without parentheses
    >>> b
    (1, 2)
    
  5. 函数的默认参数,都会。

    • 需要注意的是,如果默认参数是一个可修改的容器比如一个列表、集合或者字典,可使用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')
    
  6. 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
    >>>
    
  7. 减少某个函数的参数个数,即把某个函数的部分参数设置一个默认值: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
    
  8. 灵活使用闭包,他在函数内部带上了额外的变量环境,闭包的关键特点就是他会记住自己被定义时的环境,任何时候只要你碰到需要给某个函数增加额外的状态信息的问题,都可以考虑使用闭包。

  9. 让回调函数访问外部信息,可用类,闭包或协程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值