什么是一等对象?
一等对象需要满足以下条件:
在运行时创建;能赋值给变量或数据结构中的元素;能作为参数传给函数;能作为函数的返回结果;在python中,整数、字符串和字典都是一等对象,而下面我们介绍的是一等对象“函数”。
将函数视作对象
可以明确,python函数是对象。为什么这么说呢?我们下面来一一解答这个问题。
创建函数
def factorial(n):
return 1 if n < 2 else n * factorial(n-1)
如上,我们创建了factorial函数。
函数逻辑:如果n小于2,返回1;如果n大于等于2,则循环执行n*factorial(n-1),直到factorial(n-1)返回1为止。
调用函数
赋值n=4后调用factorial函数。
factorial(4)
24
结果返回的是24。可能会有人问,24这个结果是怎么计算出来的呢?有这样疑惑的人,可能对factorial函数的业务逻辑没有理解透彻,在这里我们一起来看下。
factorial(4),函数执行的过程是:当n=4,执行4*factorial(3);然后执行factorial(3),返回3*factorial(2);继续执行factorial(2),返回2*factorial(1)。
大家知道,factorial(1)返回的结果是1,那么整体来看,factorial(4)=4*3*2*1=24。
如果n更大,比如是123,就按照上述的逻辑,不断循环执行,直到返回确定的结果。
检查factorial的类型
type(factorial)
function
通过factorial类型的检查结果可知,factorial是function类的实例,而检查方法,就如上述代码所示,使用type()方法。
一等对象:函数
接下来介绍函数作为一等对象的特性。
首先,将函数赋值给对象。
基于上面的factorial函数,把其赋值给对象fact,然后通过变量名来调用factorial函数。
In [1]: fact=factorial
In [2]: fact
Out[2]:
其次,使用变量名调用函数。
In [3]: fact(4)
Out[3]: 24
从使用变量名调用函数生成的结果来看,与直接调用函数的结果是一致的。至少,从这里来看,函数可以赋值给变量,然后通过变量名进行调用。
map函数
函数还可以作为参数传给map函数。map函数返回一个可迭代对象,里面的元素是把第一个参数(一个函数)应用到第二个参数(一个可迭代对象)中各个元素上得到的结果。
In [1]: map(factorial,range(9))
Out[1]:
In [2]: list(map(factorial,range(9)))
Out[2]: [1, 1, 2, 6, 24, 120, 720, 5040, 40320]
In [3]: list(map(fact,range(9)))
Out[3]: [1, 1, 2, 6, 24, 120, 720, 5040, 40320]
有了一等函数后,我们就可以使用函数式风格进行python编程。