这个问题其实原理很简单.
不知道你学过面向对象没有, python 的函数是一等公民, 也就是说, 函数也是一个类型, 每一个定义的函数, 都是一个函数类的实例.
这里传入的函数, 就是一个函数对象.
而调用函数, 就是使用这个对象的_call__方法. 默认下是加括号的形式.
也就是说
def foo():
pass
foo # 函数对象
foo() # 调用函数对象__call__方法
既然, 函数是一个对象, 那么自然而然, 函数可以作为传参被调用.
换言之, 函数在 python 里面并不神奇.
racine = lambda x:x**0.5
foo = racine
这类 lambda 写法在 python 里面也极为常见. 函数跟其他类型别无二样.
面向对象跟代数的很多思想非常的一致, 如果大学对抽象代数学得比较好的同学很容易发现, 面向对象跟抽象代数关系密不可分.
例如, 什么是一个向量 ?
向量满足如下8条公理:向量加法结合律:
向量加法的单位元:
存在零向量的0,
向量加法的逆元素:
,
,使得