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

一、闭包

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())

不是我们预期的1 4 9。

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

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

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

​改进代码:

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容

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())

二、装饰器

def hello():

    print("我是一个程序")

f = hello

f()

hello()

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

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

对Python感兴趣或者是正在学习的小伙伴,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,教你如何实现边学习边用Python赚钱的学习方式。点击加入我们的 python学习者聚集地

### Python闭包的定义 在Python中,闭包是指一个嵌套函数能够访问其外部函数中的局部变量,即使该外部函数已经执行完毕并返回。这种机制使得内部函数可以“记住”它被定义时所处的作用域内的变量[^1]。 ```python def outer_function(x): def inner_function(y): return x + y # 访问外层函数的变量x return inner_function closure_example = outer_function(10) print(closure_example(5)) # 输出15 ``` 上述代码展示了如何构建一个简单的闭包。`inner_function` 是 `outer_function` 的嵌套函数,并且它可以访问来自父级作用域的变量 `x` 即使 `outer_function` 已经完成执行[^2]。 --- ### Python闭包的作用 #### 数据封装与隐藏 闭包允许我们将某些数据绑定到特定的功能逻辑之中,从而实现一定程度的数据封装和隐藏。这有助于保护这些数据不被外界随意修改[^3]。 #### 实现装饰器功能 装饰器本质上就是利用了闭包特性的一种高级应用形式。它们能够在无需改变原函数源码的前提下为其增添额外行为[^4]。 ```python def my_decorator(func): def wrapper(*args, **kwargs): print("Something is happening before the function is called.") result = func(*args, **kwargs) print("Something is happening after the function is called.") return result return wrapper @my_decorator def say_hello(): print("Hello!") say_hello() ``` 在这个例子中,`wrapper` 函数构成了围绕原始函数的一个闭包环境,实现了前后置操作的效果。 --- ### Python闭包的实际应用场景 #### 惰性求值(Lazy Evaluation) 通过闭包延迟计算直到真正需要结果为止,这对于优化性能特别重要尤其是处理大规模数据集时[^2]。 #### 参数化配置 可以通过设置默认参数创建一系列具有相似但又略有差异的行为模式的方法集合[^3]。 ```python def line_conf(a, b): def line(x): return a * x + b return line line1 = line_conf(2, 3) # 定义直线y=2x+3 line2 = line_conf(-1, 5) # 定义另一条直线y=-x+5 print(line1(1), line2(1)) # 分别得到5 和 4 ``` 这里展示了一个典型的线性方程组的例子,其中每种类型的线条都由各自的系数决定并通过相应的调用来生成具体的数值输出。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值