Python --- 返回函数
2017-12-26 16:21
155 查看
返回函数
顾名思义:即函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。我们来实现一个可变参数的求和,通常情况下,求和函数是这样定义的:
def clal(*num): ax = 0 for i in num: ax = ax + i return ax
但是,如果不需要立即求和,而是在后面的代码中,根据需要在计算怎么办?可以不返回求和的结果,而是返回求和函数。
def cala(*n): def num(): sun = 0 for i in n sun = sun + i return sun return num #这里要return sun 而不是sun()
当我们调用
cala()函数时,返回的并不是求和结果,而是求和函数。
f1 = lazy_num(1,2,3,4) f2 = lazy_num(1,2,3,4) print(f1, '\n', f2) print(f1()) output: <function lazy_num.<locals>.num at 0x01F30BB8> <function lazy_num.<locals>.num at 0x01F30738> 10
可见,当调用
f()才会计算出结果,而直接输出
f1 f2时只会显示出函数被赋值之后的地址,而且
f1 f2的地址是不一样的。
在这个例子中,我们在函数
cala中定义了函数
num,并且内部函数
num可以调用外部函数
cala的参数和局部参数,当
cala返回函数
num时,相关参数和变量都被保存在返回的函数中,这种称为’闭包(Closure)’的程序结构具有强大的威力。
请再注意一点,当我们调用
cala函数时,每次调用都会回一个新的函数,即使是传入相同的参数,就像上面输出结果一样。
闭包
注意到返回的函数在其定义内部引用了局部变量n,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用,所以,闭包用起来简单,实现起来可不容易。另一个需要注意的问题是,返回的函数并没有立刻执行,而是直到调用了
num()函数才执行,来看一个例子:
def count(): fs = [] for i in range(1,4): def f(): return i * i fs.append(f) return fs f1, f2, f3 = count() print(f1(), f2(), f3()) #输出结果为 9 9 9
全部都是9,原因就在于返回的函数引用了变量
i但它并非立刻执行,等到3个函数都返回时,它们所引用的的
i都已经变成了3,因此最终返回值都是9
返回闭包时牢记一点:返回函数不引用循环变量,或者后续会发生变化的变量
如果一定要引用循环变量怎么办?方法就是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
def count(): def f(j): def g(): return j * j return g fs = [] for i in range(1,4): fs.append(f(i)) return fs f1, f2, f3 = count() print(f1(), f2(), f3()) #输出为 1 4 9
缺点是代码较长,可利用
lambda函数缩短代码
学习网站:廖雪峰的官方网站–返回函数
相关文章推荐
- Python 函数返回值
- python函数返回多个值的示例方法
- Python单元测试中mock一个返回generator的函数
- Python os模块中的isfile()和isdir()函数均返回false问题解决方法
- 【13】python列表去重/寻找一个文件夹中的所有文件/函数返回多个值
- Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数
- 【编程语言】Python 函数多值返回
- 笨办法学python习题21 函数可以返回某些东西
- Python 函数返回值
- python 函数返回多个值
- python基础——返回函数
- Learning Python 012 函数式编程 2 返回函数 匿名函数 装饰器 偏函数
- python中的返回函数
- python 的 map(),reduce(),filter(),返回函数,闭包
- think python学习心得-(4)有返回函数
- Python函数返回不定数量的值
- python 函数的嵌套定义 and 函数的返回值是函数
- python multiprocessing进程执行自定义的函数,然后又返回结果
- Python---返回函数
- 【Python】学习笔记——-5.2、返回函数