闭包函数初探
通常我们定义函数都是这样定义的
def foo(): pass
其实在函数式编程中,函数里面还可以嵌套函数,如下面这样
def foo(): print("hello world in foo") def bar(): print("hello world in bar")
此时我们调用foo函数,执行结果会是什么样子的呢??
hello world in foo
结果如上所示,只会执行foo函数的第一层函数,bar函数是不会被执行的。为什么呢
实际上来说,不管函数写在哪个部分,那都只是定义了一个函数,只有这个函数被调用,函数内部的语句才会被执行
在上面的例子中,bar函数虽然在foo函数内部定义了,但是并没有被执行,所以bar函数是不会被执行的这样说来,定义在一个函数内部的函数就没什么作用了吗??其实不是这样的。
来看下面的例子,把bar函数作为一个值返回给foo函数,来看执行过程
def foo(): print("hello world in foo") def bar(): print("hello world in bar") return barf1=foo()print(f1)
此时,由于bar函数作为一个返回值被返回给了foo,所以foo函数执行结果是有返回值的
此时定义一个变量f1来接收foo函数的执行返回结果,然后打印f1
返回的结果如下
hello world in foo<function foo.<locals>.bar at 0x0000000002941A60>
可以看到首先打印了foo函数中定义的一个print语句,接着打印的是foo函数中包含的bar函数的内存地址
既然是一个函数的内存地址,当然可以加括号来执行这个函数
def foo(): print("hello world in foo") def bar(): print("hello world in bar") return barf1=foo()f1()
此时,这段代码的执行结果为:
hello world in foohello world in bar
两个print语句都被打印出来了。
在上面的例子里,首先定义了一个函数foo,接着在foo函数内部又嵌套定义了一个函数bar,然后返回函数bar的函数名,这就是闭包函数的定义方式。
其实,闭包的定义就是一个函数内部又嵌套了一个函数
来看下面的这段代码
def foo(): print("hello world in foo") name="python" def bar(): print(name) print("hello world in bar") return bar f1=foo() f1()
在上面的例子里,在外层函数中定义了一个变量name,然后在内层函数中打印这个变量name
此时执行上面的代码,在打印name这个变量的时候,会先在bar函数内部查找name这个变量,但是bar函数里面是没有name这个变量的,
此时根据python查找变量的LEGB法则,会到bar函数的外面一层去继续查找name这个变量,此时可以找到name这个变量
所以这里打印的foo函数中定义的name的值
新闻热点
疑难解答