返回函数,顾名思义,就是高阶函数可以把函数作为return值返回。与闭包的关系是:闭包需要以返回函数的形式实现。
一. 返回函数
比如我们有一个求和函数:
>>> def calc_sum(num_list): s = 0 for i in num_list: s += i return s >>> calc_sum([1,2,3,4]) 10
当我们不需要立刻求和,而是后面根据需要再计算结果时,我们可以返回求和的函数,而不是直接返回计算结果。这就是返回函数。
>>> def lazy_calc_sum(num_list): def calc_sum(): s = 0 for i in num_list: s += i return s return calc_sum >>> f_lazy = lazy_calc_sum([1,2,3,4]) >>> f_lazy <function lazy_calc_sum.<locals>.calc_sum at 0x0000003A8D92E9D8> >>> f_lazy() 10
很显然,这样能让我们根据需求,节省计算资源。
二. 闭包
在上面的例子中,我们在函数lazy_clac_sum
中又定义了函数calc_sum
,并且,内部函数calc_sum
可以引用外部函数lazy_calc_sum
的参数和局部变量,当lazy_calc_sum
返回函数calc_sum
时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。
实际上,闭包的用处/优点有两条:
- 从函数外可以读取函数内部的变量
- 让这些变量的值始终保持在内存中