定义
在Python中,函数是一等对象。函数通常出现在模块的顶级作用域中。
满足如下条件的程序,可以称为一等对象。
- 在运行时创建
- 能赋值为变量或者作为数据结构中的元素
- 能作为参数传递给函数
- 能作为函数的返回值
方法和函数的定义类似,方法出现在类的作用域内。
参数
Python 唯一支持的参数传递模式是共享传参。共享传参是指函数的各个形式参数获得实参中各个引用的副本。
定义函数时,可以指定两种类型的参数:位置参数和关键字参数。
其中,位置参数可以是一个值,也可以是多个值组成的可迭代对象;关键字参数是由键值对组成的可迭代对象。
在调用函数时,使用*
和**
展开参数,映射到单个参数。
在传递位置参数时,要注意参数的顺序;关键字参数则不需要。
如果函数的某些参数需要强制使用关键字参数传递时,可以将强制关键字参数放到某个带
*
位置参数或者单个*
后面。
默认参数
默认参数在函数定义的时候进行一次赋值操作。在代码执行一次的过程中,无论该函数被调用多少次,默认参数不会发生变化。
注意,不要将可变对象作为默认参数的值。如果多次调用该函数,默认值会发生变化。
返回值
在Python中,函数的返回值默认为None。
如果需要返回一个或多个值,使用return显示返回。
闭包
闭包是指延伸了作用域的函数,其中包含函数定义体中引用、但是不在定义体中定义的非全局变量。
闭包会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍能使用这些绑定。
nonlocal关键字
nonlocal关键字的作用就是将变量标记为自由变量,即使在函数中为变量赋予新值,也会变成自由变量。
高阶函数和匿名函数
接受函数作为参数,或者返回函数作为参数的函数为高阶函数。常见的高阶函数包括sorted, map, reduce, filter.
使用lambda关键字创建匿名函数。
在lambda函数中,只能使用纯表达式,不能进行赋值。
支持函数式编程的标准库
operator库
该标准库将函数分为四类:对象比较、逻辑操作、数学操作、序列操作和抽象类型测试。
methodcaller
函数返回一个可调用对象。methodcaller还可以冻结某些参数。
itemgetter
函数,使用操作符的__getitem__()
方法获取元素,将获取元素构成的元组返回。
attrgetter
函数,创建的函数根据名称提取对象的属性,如果把多个属性名传给attrgetter, 它也会返回提取的值构成的元组。
functools.partial
冻结参数
partial
用于部分引用一个函数。部分应用是指,基于一个函数创建一个新的可调用对象,把原函数的某些参数固定。
partialmethod
函数和partial
的作用相同,它用于处理方法。
函数注解
函数作为对象,有很多属性,如__dict__
, __annotations__
, __call__
, __defaults__
等。
函数注解,用于为函数定义中的参数和返回值附加元组数据。注解不会做任何处理,只存储在函数的__annotations__
属性中。
inspect模块
inspect模块用于获取函数的签名以及参数。
方法
静态方法
使用@staticmethod
装饰的方法为静态方法。其实,静态方法就是普通的函数,只是碰巧在类的定义体中,而不是模块层定义。
类方法
类方法用@classmethod
装饰器来装饰,classmethod装饰器定义操作类,而不是操作实例的方法。
类方法的第一个参数为cls(约定俗称),是类本身,而不是实例(self).
classmethod最常见的用途是定义备选构造方法。
参考
-
Fluent Python
-
Python Cookbook
-
Python 标准库