一等函数:将函数视作对象
在python中,可以视函数为function类的对象。由于python的变量赋值自带类似于C++中的auto类型,因此实际上可以定义一个函数,然后将这个函数赋值给一个变量,此时这个变量也是函数,并且它是可调用的(callable == True
)。一等函数可以作为高阶函数(以函数作为参数,如sorted的排序功能,可以传入len参数作为函数以按照长度进行排序)。
from functools import reduce
from operator import add
reduce(add, range(100))
👆lambda表达式本身就是一个匿名函数。
用户定义的可调用类型
在类定义中实现双下方法__call__()
,即可以函数调用的方式调用类对象。
import random
class BingoCase:
def __init__(self, items):
self._items = list(items)
random.shuffle(self._items) #使用random中的shuffle方法将序列_items中的元素顺序打乱
def pick(self):
try:
return self._items.pop() #pop默认弹出序列中的最后一个元素
except:
raise LookupError('Pick from empty Bingo')
def __call__(self):
return self.pick() #实现名为call的双下方法,使类对象成为可调用的。
bingo = BingoCase(range(100))
bingo.pick()
Out: 9
bingo() #直接以函数调用的方式调用类对象
Out: 3
callable(bingo) #查看bingo对象是否为可调用的
out: True #显然是可调用的。
👆这模糊了python中对象与函数的界限。