欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python连载18-closure闭包解释及其注意点

程序员文章站 2023-08-12 10:46:12
一、闭包 1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包。 2.例子:连载17中的myF4就是一个典型的例子​。 3.闭包常见的坑 不是我们预期的1 4 9。 (1)原因分析:返回 ......

一、闭包

1.定义:当一个函数在内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,当内部函数被当做返回值的时候,相关参数和变量保存在返回的函数之中,这种结果,叫做闭包。

2.例子:连载17中的myf4就是一个典型的例子​。

3.闭包常见的坑

 

def count():

    #定义列表

    fs = []

    for i in range(1,4):

        def f():

            return i*i

        fs.append(f)

        #按照我们的预期,应该是fs=[f,f,f].其中f中一次包含1,4,9,这样才对,但实际结果不是,我么接着看

    return fs

f1,f2,f3 = count()

print(f1(),f2(),f3())

 

Python连载18-closure闭包解释及其注意点

不是我们预期的1 4 9。

(1)原因分析:返回函数引用了变量i,i并非立即执行,而是等到三个函数都返回的时候才统一执行,此时i已经变为3,最终调用的时候却反回了3*3.

(2)总结:返回闭包的时候,返回函数不能引用任何循环变量了

(3)解决方案:再创建一个函数,用该函数的参数绑定循环变量的当前值,无论该循环变量以后如何改变,已经绑定的函数参数值不变。

​改进代码:

 

def count2():

    def f(j):

        def g():

            return j*j

        return g

    fs = []

    for i in range(1,4):

        fs.append(f(i))

        #我们进行了传参,因此j就固定下来,它就执行了j

    return fs

f4,f5,f6 = count2()

print(f4(),f5(),f6())

Python连载18-closure闭包解释及其注意点

二、装饰器

def hello():

    print("我是一个程序")

f = hello

f()

hello()

#用id来证明f和hello是一个函数

print(id(f),id(hello))

Python连载18-closure闭包解释及其注意点

三、源码:

d20_2_closure_interpretation

地址:https://github.com/ruigege66/python_learning/blob/master/d20_2_closure_interpretation

2.csdn:https://blog.csdn.net/weixin_44630050(心悦君兮君不知-睿)

3.博客园:https://www.cnblogs.com/ruigege0000/

4.欢迎关注微信公众号:傅里叶变换,后台回复”礼包“,获取大数据学习资料。

Python连载18-closure闭包解释及其注意点