「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」
一等对象与一等函数
在 Python 中,整数、字符串和字典都是一等对象。函数也是一等对象。人们经常将“把函数视作一等对象”简称为“一等函数”。
编程语言理论家把“一等对象”定义为满足下述条件的程序实体:
- 在运行时创建
- 能赋值给变量或数据结构中的元素
- 能作为参数传给函数
- 能作为函数的返回结果
高阶函数
接受函数为参数,或者把函数作为结果返回的函数是高阶函数。如 map
和 sorted
。
在函数式编程范式中,最为人熟知的高阶函数有 map
、filter
、reduce
和 apply
。
在 Python 3 中,map
和 filter
返回生成器(一种迭代器)。列表推导或生成器表达式具有 map
和 filter
两个函数的功能,而且更易于阅读。举个栗子:
list(map(fact, range(6))) # [1, 1, 2, 6, 24, 120] 阶乘
[fact(n) for n in range(6)] # [1, 1, 2, 6, 24, 120]
list(map(factorial, filter(lambda n: n % 2, range(6)))) # [1, 6, 120]
[factorial(n) for n in range(6) if n % 2] # [1, 6, 120]
复制代码
在 Python 2 中,reduce
是内置函数,但是在 Python 3 中放到 functools
模块里了。
apply
函数在 Python 2.3 中标记为过时,在 Python 3 中移除了,因为不再需要它了。如果想使用不定量的参数调用函数,可以编写 fn(*args, **keywords)
,不用再编写 apply(fn, args, kwargs)
。
匿名函数
lambda
关键字在 Python 表达式内创建匿名函数。lambda
句法只是语法糖:与 def
语句一样,lambda
表达式会创建函数对象。
函数的属性
使用 dir
函数可以查看函数对象属性:dir(function_name)
类的实例没有而函数有的属性:
名称 | 类型 | 说明 |
---|---|---|
__annotations__ |
dict |
参数和返回值的注解 |
__call__ |
method-wrapper |
实现 () 运算符;即可调用对象协议 |
__closure__ |
tuple |
函数闭包,即自由变量的绑定(通常是 None ) |
__code__ |
code |
编译成字节码的函数元数据和函数定义体 |
__defaults__ |
tuple |
形式参数的默认值 |
__get__ |
method-wrapper |
实现只读描述符协议 |
__globals__ |
dict |
函数所在模块中的全局变量 |
__kwdefaults__ |
dict |
仅限关键字形式参数的默认值 |
__name__ |
str |
函数名称 |
__qualname__ |
str |
函数的限定名称,如 Random.choice |