【Python】 函数、高阶函数、匿名函数 与 函数属性

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

一等对象与一等函数

在 Python 中,整数、字符串和字典都是一等对象。函数也是一等对象。人们经常将“把函数视作一等对象”简称为“一等函数”。

编程语言理论家把“一等对象”定义为满足下述条件的程序实体:

  • 在运行时创建
  • 能赋值给变量或数据结构中的元素
  • 能作为参数传给函数
  • 能作为函数的返回结果

高阶函数

接受函数为参数,或者把函数作为结果返回的函数是高阶函数。如 mapsorted

在函数式编程范式中,最为人熟知的高阶函数有 mapfilterreduceapply

在 Python 3 中,mapfilter 返回生成器(一种迭代器)。列表推导或生成器表达式具有 mapfilter 两个函数的功能,而且更易于阅读。举个栗子:

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

Guess you like

Origin juejin.im/post/7034408583278100517