深入理解Python特性 - 2-高效的函数
Contents
函数是对象
- Python中一切皆对象,函数也如此。可以将函数分配给变量或者存储在数据结构中。作为头等对象,函数还可以被传递给其他函数或作为其他函数的返回值。
- 能够接收其他函数作为参数的函数称之为高阶函数。如map、reduce、filter等等。
- 函数可以嵌套,并且可以捕获并携带父函数的一些状态。具有这种行为的函数成为闭包。
- 对象可以被设置成可调用的,因此很多情况下可以将其作为函数对待。(类中需实现
_call__
方法)
lambda表达式
- lambda函数是单表达式函数,不必与名称绑定。
- lambda函数不能使用普通的Python函数,其中总是包含一个隐式的return语句。
- lambda与具名函数应该如何使用?是否使得程序的表述更加的清晰。
装饰器
装饰器利用了"头等函数"中的一些特性:
- 函数是对象,可以分配给变量并传递给其他函数,以及从其他函数返回;
- 在函数内部也能定义函数,且子函数可以捕获父函数的局部状态(闭包)。
装饰器要点:
- 装饰器用于定义可重用的组件,可以将其应用于可调用对象以修改其行为,同时无须永久修改可调用对象本身。
- @语法只是在输入函数上调用装饰器的简写。在单个函数上应用多个装饰器的顺序是从底部到顶部。
- functools.wraps能将被装饰对象中的元数据转移到装饰后的对象中。
- 不应过度使用装饰器,装饰器容易产生可怕且不可维护的代码,要注意取舍。
解包
*args
和**kwargs
用于在Python中编写变长参数的函数。*args
收集额外的位置参数组成 元组,**kwargs
收集额外的关键字参数组成字典。- 实际其作用的语法是
*
和**
。 *
从序列(包括 可迭代对象 、生成器表达式)中解包 和**
从字典中解包。- 高效使用参数解包 有助于为模块和函数编写更加灵活的接口。
返回空值
- 如果函数没有制定返回值,那么会返回None。
- 返回空值是Python的核心功能,但是显性的return None语句能更清晰的表达代码的意图。