0. 问题
# 本文将围绕这段代码进行Python中高阶函数相关内容的讲解
# 文中所有代码的兼容性要求为:Python 3.6,IPython 6.1.0
def addspam(fn):
def new(*args):
print("spam,spam,spam")
return fn(*args)
return new
@addspam
def useful(a,b):
print(a**2+b**2)
if __name__ == "__main__":
useful(1,2)
1. Python中一切皆对象
你已经学习了Python中的list, tuple, dict等内置数据结构,当你执行:alist = [1, 2, 3]时,你就创建了一个List对象,并且用alist这个变量引用它:
当然你也可以自己定义一个类:
class House(object):
def __init__(self, area, city):
self.area = area
self.city = city
def sell(self, price):
[...] #other code
return price
# 然后创建一个类的对象:
house = House(200, 'Shanghai')
OK,你立马就在上海有了一套200平米的房子,它有一些属性(area, city),和一些方法(__init__, self):
2. 函数是第一类对象
和list, tuple, dict以及House instance一样,当你定义一个函数时,函数也是对象:
def func(a, b):
return a + b
在全局域,函数对象func(a,b)被函数名func引用着,它接收两个参数a和b,计算这两个参数的和作为返回值。
所谓第一类对象,意思是可以用标识符给对象命名,并且对象可以被当作数据处理:例如赋值、作为参数传递给函数,或者作为返回值return 等
因此,你完全可以用其他变量名引用这个函数对象:
def func(a, b):
return a + b
add = func
这样,你就可以像调用func(1, 2)一样,通过新的引用add调用函数了:
print(func(1, 2))
print(add(1, 2)) #the same as func(1, 2)
或者将函数对象作为参数,传递给另一个函数:
def func(a, b):
return a + b
def caller_func(f):
return f(1, 2)
if __name__ == "__main__":
print(caller_func(func))
可以看到,