一、简述在python中万物皆为对象,函数也不例外。python中函数作为第一类对象是python函数的一大特性。
python函数作为第一类对象可以赋值给一个变量、可以作为元素添加到集合对象中、可以作为参数传递给其它函数、可以当做其它函数的返回值,这些特性是第一类对象所特有的。
如果要更好地理解python装饰器、匿名函数、函数式编程等高阶技术,就需要先正确理解python函数作为第一类对象的含义。
二、函数是对象def func(text): return len(text)func('First-Class Object')# output# 182.1 函数作为一个对象,拥有对象模型的三大特性:id、类型、值>>> id(func)4361313715>>> type(func)>>> func2.2 作为对象,函数可以赋值给一个变量>>> new_func = func赋值给变量时,函数并不会被调用,只是绑定了一个新的命名,但是该函数的引用计数会增加,本质上这些变量最终指向都是同一个函数对象。
>>> new_func('First-Class Object')>>> 18三、函数可以存储在容器中容器对象(list, dict, set等)中可以存放任何对象,包括函数。
>>> func_obj_list = [func, new_func, len, str]>>> func_obj_list[, , , ]for f in func_obj_list: print(f('hello'))# output# 5# 5# 5# hello四、函数可以作为参数函数还可以作为参数传递给另一个函数
>>> def show(func):... size = func('First-Class Object')... print(f'length of string is: {size}')...>>> show(func)length of string is: 18五、函数可以作为返回值函数可以作为另一个函数的返回值
>>> def nick(): return func>>> nick >>> nick()('python')6当一个函数接受一个或多个函数作为输入或者当一个函数的返回值也是函数时,这样的函数被称为高阶函数。
python内置函数中map函数就是一个典型的高阶函数。
>>> lens = map(func, ['a', 'bb', 'ccc'])>>> list(lens)[1, 2, 3]map函数相当于
>>> [func(i) for i in ['a', 'bb', 'ccc'][1, 2, 3]六、函数可以嵌套>>> def get_length(text):... def clean(t): # 2... return t[1:]... new_text = clean(text) # 1... return len(new_text)...>>> get_length("python")5七、实现了__call__(双下划线)的类也可以作为函数如果一个类实现了__call__方法,那么这个类的实例对象的行为就是一个函数,是一个可被调用的对象
class Add: def __init__(self, n): self.n = n def __call__(self, x): return self.n + x>>> add = Add(1)>>> add(4)>>> 5执行add(4)相当于调用Add.__call__(add, 4),self就是实例对象。
八、总结python中包含函数在内的一切皆为对象,函数作为第一类对象,支持赋值给变量,作为参数传递给其它函数,作为其它函数的返回值,支持函数嵌套,实现了__call__方法的类实例对象也可以当做函数被调用。