资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

python中的闭包是什么意思

这篇文章主要介绍“python中的闭包是什么意思”,在日常操作中,相信很多人在python中的闭包是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中的闭包是什么意思”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联建站专注于多伦网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供多伦营销型网站建设,多伦网站制作、多伦网页设计、多伦网站官网定制、小程序定制开发服务,打造多伦网络公司原创品牌,更为您提供多伦网站排名全网营销落地服务。

闭包的定义

闭包就是函数内部定义的函数。

闭包的逻辑

理解闭包的逻辑之后,有了一定python基础的都可以很容易写出闭包。下面通过案例来讲一下闭包的逻辑。

def discount(x):
    if x<0.5 or x>1:
        return None
    def count(prince, number):
        result = prince * number
        pay = result * x
        print(f'总价是{result}元,实付{pay}元')
    return count
discount(0.8)(2.88, 100)

out:
总价是288.0元,实付230.4元

以上代码是销售商品时经常遇到的案例,discount函数是外层函数,用来检测打折数字是否合理。count是内层函数,用来计算总金额和实付金额。

python解释器遇到def discount时会在全局命名空间增加一个discount对象,它的值指向discount函数内的代码块。此时discount函数没有运行。

在遇到discount(0.8)(2.88, 100)时开始运行函数discount(0.8),在遇到def count会在discount的局部命名空间增加一个count对象,它的值指向count函数内的代码块。在遇到return count时会把count对象返回给discount(0.8)(2.88,100)。此时discount(0.8)部分已经运行完毕,接下来运行的是count(2.88,100)。count(2.88,100)内部代码块运行完毕后,整个闭包函数运行完毕。

python中的闭包是什么意思)

闭包的扩展

我们可以通过如下的方式对闭包进行扩展,更加方便使用:

def discount(x):
    if x < 0.5 or x > 1:
        print('折扣数字不合理。')
        return

    def count(prince, number):
        result = prince * number
        pay = result * x
        print(f'总价是{result}元,实付{pay}元')

    return count

goldcard = discount(0.7)
silvercard = discount(0.9)
commomcard = discount(1)
goldcard(2.88, 100)
silvercard(2.88, 100)
commomcard(2.88,100)
print(id(goldcard))
print(id(silvercard))
print(id(commomcard))

out:
总价是288.0元,实付201.6元
总价是288.0元,实付259.2元
总价是288.0元,实付288.0元
1986802704096
1987081368336
1987081368192

将外层函数加参数赋值给另外一个变量,相当于定义了一个新的函数,提高了代码复用率。上述goldcard、silvercard、commomcard这3个函数虽然都指向了discount函数,但是因为它们的参数不同,实际上是3个独立的对象,可以看到它们的id各不相同。

到此,关于“python中的闭包是什么意思”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


分享标题:python中的闭包是什么意思
网页地址:http://cdkjz.cn/article/gjssci.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220