一、什么是返回函数?
返回函数,简单的说就是返回值是一个函数。
返回的是函数,调用返回的函数的时候才会返回结果。
二、闭包 (以返回函数的形式实现)
相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。
- def returnre(a, b):
- def re():
- return a + b
- return re
- test01 = returnre(1, 2)
- test02 = returnre(1, 2)
- print(test01 == test02) # 每次调用都会返回新生成的函数
比如上面例子的re函数闭包的特性,嵌套定义在非全局作用域里面的函数,能够记住它在被定义的时候它所处的封闭命名空间。
来看一个例子:
- def closur(a):
- def myprint():
- print(a)
- return myprint
- test = closur(1)
- test()
代码解析:
变量a是函数closur的一个本地变量,只应该存在于函数运行时,但正因为闭包的特性,将a的值封装进了返回函数。
- def closuretest02(*args):
- f = []
- for i in args:
- def test():
- return i**2
- f.append(test)
- return f
- test = closuretest02(1,2,3,4)
- for i in test:
- print(i())
返回闭包时牢记的一点就是:
返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量怎么办?
方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
- def count():
- def f(j):
- def g():
- return j*j
- return g
- fs = []
- for i in range(1, 4):
- fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
- return fs
再看看结果:
- f1, f2, f3 = count()
- print(f1())
- print(f2())
- print(f3())
注:
缺点是代码较长,可利用lambda函数缩短代码。
一个函数可以返回一个计算结果,也可以返回一个函数。返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
三、拓展
nonlocal
nonlocal适用于嵌套函数中内部函数修改外部变量的值。
- def outside():
- a = 1
- print('outside' + str(id(a)))
- def inside():
- nonlocal a
- print('inside ' + str(id(a)))
- inside()
- outside()
因为使用nonlocal后,返回了闭包中有父函数的变量,所以父函数那里不会被回收。
四、总结
本文基于Python基础,介绍了返回函数。常见的返回函数的应用。函数作为返回值,闭包在实际应用中需要的点,遇到的难点,提供有效的解决方案。使用Python语言,能够更好的理解。
欢迎大家积极尝试,有时候看到别人实现起来很简单,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。
代码很简单,希望对你学习有帮助。
本文转载自微信公众号「Go语言进阶学习」,可以通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。