目录
前言
“一等对象”是指满足下述条件的程序实体:
- 在运行时创建
- 能赋值给变量或数据结构中的元素
- 能作为参数传给函数
- 能作为函数的返回结果
在python中,整数、字符串、字典等都是一等对象,这跟其它编程语言一致,但是python中的所有函数也是一等对象,或者可以称之为一等函数(所有函数都是一等函数,不存在二等三等函数的说法)。
一、把函数视作一等对象
def factorial(n):
'''returns n! good!'''
return 1 if n < 2 else n * factorial(n - 1)
print(factorial(21))
print(factorial.__doc__)
print(type(factorial))
fact = factorial
print(fact)
print(fact(5))
print(list(map(fact, range(11))))

如上例子可看出,函数本身也是一个对象,factorial对象是function类的实例。注意在函数体开头用三个单引号括起来的是自定义的函数的帮助文档。__doc__是函数对象的一个属性,用于返回对象的帮助文档。
可以把factorial函数赋值给变量fact,然后通过变量名调用,还能把fact作为参数传递给map函数,map函数返回一个可迭代对象,里面的元素是把第二个参数中的各个元素传递给第一个参数得到的结果。这体现了函数的一等性。
二、高阶函数
高阶函数定义
函数式编程的特点之一是使用高阶函数。高阶函数是以函数为参数,或者把函数作为结果返回的函数。上小节中的map函数就是例子。还有内置的sorted函数也是,其可选的key参数可以提供一个函数,应用到各个元素上进行排序。
如下例子,若想根据单词的长度排序,只需把len函数传递给key参数。任何单参数函数都能作为key的实参。

函数式编程中最常用的高阶函数有map、filter、reduce等。不过现在都有很好的替代品。
map、filter、reduce的现代替代品
函数式语言通常会提供map、filter和reduce三个高阶函数。python3中,map和filter还是内置函数,但是由于引入列表推导式和生成器表达式,他们变得没那个重要了。列表推导和生成器表达式具有map和filter两个函数的功能。如下例子:

python3中,map和filter返回生成器,它们的直接替代品是生成器表达式。
python2中,reduce是内置函数,python3中放到了functools模块里了。这个函数最常用于求和。

sum和reduce的通用思想是把某个单参数函数连续应用到一个序列中的元素上,累计之前的结果,把一系列值归约成一个值。
all和any也是内置的归约函数,all(iterable),如果iterable中每个元素都是真值,返回True,all([ ])返回True。any(iterable),只要iterable中有元素是真值,就返回True,any([ ])返回False。
为了使用高阶函数,有时创建一次性的小型函数更遍历,这便是匿名函数存在的原因。
三、匿名函数
lambda关键字在python表达式内创建匿名函数。
python中,lambda函数的定义体中只能使用纯表达式,即不能赋值,也不能使用while和try等python语句。如下例所示,lambda表达式中冒号之前部分即为形参,冒号后是一个表达式用于处理形参并返回。在python中,除了传给高阶函数,一般情况下lambda表达式只是语法糖。

四、可调用对象
除了函数,调用运算符()还可以应用到其它对象上,要判断对象能否调用,可以使用内置的callable()函数。

本文详细介绍了Python中的函数式编程概念,包括函数作为一等对象、高阶函数、匿名函数、可调用对象、函数内省、仅限关键字参数、函数注解以及支持函数式编程的内置模块。通过示例展示了如何使用map、filter、reduce的现代替代品,以及如何利用lambda表达式和functools模块实现函数式编程。同时,文章还探讨了如何获取函数参数信息和使用inspect模块进行函数内省。
最低0.47元/天 解锁文章
762

被折叠的 条评论
为什么被折叠?



