一等对象
编程语言理论家把“一等对象”定义为满足下述条件的程序实体:
- 在运行是创建
- 能赋值给变量或数据结构中的元素
- 能作为参数传给函数
- 能作为函数的返回结果
把函数当作对象
函数都是function
类的实例,类的方法是method
类的实例(虽然经常会把方法称为函数)
|
|
高阶函数
接受函数为参数或者把函数作为结果返回的函数
称为高阶函数
。
在函数式编程范式中,最为人熟知的高阶函数有map()
, filter()
, reduce()
all()
和any()
all(iterable)
, 如果iterable
的每个值都为True
,返回True
any(iterable)
, 如果iterable
存在一个值为True
,返回True
匿名函数
使用lambda
关键字创建匿名函数,格式为lambda [arg1 [,arg2,.....argn]]:expression
,匿名函数的定义体中不能赋值,不能使用while
和try
语句。
我十分不喜欢用匿名函数,基本没有用过,即使是用高阶函数需要传递函数作为参数时,也是额外用def
语句编写函数,所以一直对lambda
理解不到位。
匿名函数这样理解:将arg x
作为参数传递给expression
,得到结果后返回。
Lundh
提出的lambda
表达式重构秘笈:
- (1)编写注释,说明
lambda
表达式的作用 - (2)研究注释,用一个名称来概括注释
- (3)把
lambda
表达式改写成def
,使用那个名称作为函数名 - (4)删除注释
可调用对象
使用callable()
函数可判断是否为可调用对象。python中有7种可调用对象:
- 用户使用
def
和lambda
创建的函数 - 内置函数,使用C语言(CPython)实现的函数,如
len
或time.strftime
- 使用C语言实现的方法,如
dict.get
- 方法,在类的定义体中定义的函数
- 类,调用类时会运行
__new__
方法创建一个实例,python没有new
运算符,所以调用类相当于调用函数 - 定义了
__call__()
类的实例 - 生成器函数,使用yield关键字的函数或方法
|
|
函数内省
函数内省(function introspection)是在运行时进行的一种对象检测机制,用来查看某个对象内部信息,如类的type类型、属性、方法、事件等等。
(内省: 文言,意思是查看内部情况。华夏特色的翻译,恕我直言,把第一个叫这个名字的人拉出去斩了)
python中使用dir()
可以获得对象的各种信息。
|
|
获取关于参数的信息
以我目前水平不能理解作者在讲的这些内容有什么作用
函数注解
|
|
函数声明中的各个参数可以在:
之后增加注解表达式。如果参数有默认值,注解放在参数名和=
号之间。如果想注解返回值,在)
和函数声明末尾的:
之间添加->
和一个表达式。这个表达式可以是任何类型,在上面的例子中是str
注解不会做任何处理,只是存储在函数的__annotations__
属性(一个字典)中
|
|
支持函数式编程的包
|
|
operator
模块为多个算术运算符提供了对应的函数,从而避免编写lambda a, b: a*b
这种平凡的匿名函数
itemgetter
和attrgetter
operator
模块中还有一类函数,能替代从序列中取出元素或读取对象属性的lambda
表达式,如itemgetter
和attrgetter
|
|
attrgetter
类似
methodcaller
methodcaller
创建的函数会在对象上调用参数指定的方法
|
|
functools.partial
|
|
固定第一个参数为3, 传入7则结果为21