美文网首页
(9) python之闭包

(9) python之闭包

作者: Wei_Lai | 来源:发表于2018-10-31 23:24 被阅读0次

闭包
闭包 = 函数 + 环境变量(函数定义的时候)

一个最简单的闭包

def curve_pre():
    def curve():
        print('This is a function')
    return curve

f = curve_pre()
f()   #This is a function

闭包不受外部变量影响

def curve_pre1():
    a = 25
    def curve1(x):
        return a*x**2
    return curve1

#闭包 = 函数 + 环境变量(函数定义的时候)
a = 20     #全局变量
f1 = curve_pre1()
print(f1.__closure__)  
 #(<cell at 0x00000216457D06D8: int object at 0x00007FFEF75AD720>,)实质返回了一个闭包
print(f1.__closure__[0].cell_contents)  #25  取出环境变量
f1(2)   
print(f1(2))  #100   调用时 a 取 25

非闭包

def f2():
    a = 10
    def f3():
        #a(=20)被python 认为是一个局部变量,没有引用上面的a(=10)(环境变量)就不是闭包了
        a = 20
        print(a)
    print(a)
    f3()
    print(a)

f2()
#首先运行f2() ,a=10,print(a)即为10
#然后运行f3() ,a=20,print(a)即为20,此时a为f3()中的局部变量
#最后print(a)即为10

闭包

def f4():
    a = 10
    def f5():
        c = 20 * a   #调用了 a=10
    return f5

f = f4()
print(f) #<function f4.<locals>.f5 at 0x0000015AF4F479D8>
print(f.__closure__)
#(<cell at 0x0000015AF4ED06D8: int object at 0x00007FFC0F54D540>,)

闭包 只是一种思维方式,函数式编程

闭包可以记忆上次调用的状态

例题,origin 最初为0,累加计算

#闭包模式
origin = 0

def factory(pos):
    def go(step):
        nonlocal pos #pos不是本地局部变量
        new_pos = pos +step
        pos = new_pos
        return new_pos
    return go

tourist = factory(origin)   #初始化为 0
print(tourist(2))    #即step为2
print(tourist.__closure__[0].cell_contents)#取环境变量#2记住了调用的值
print(tourist(3))
print(tourist.__closure__[0].cell_contents)#5
print(tourist(5))
print(tourist.__closure__[0].cell_contents)#10
print(origin)  #0  使用闭包,并没有改变全局变量,所有操作都在函数内部
#非闭包
origin = 0
def go(step):
    global origin   #定义一个全局变量
    new_pos = origin + step
    origin = new_pos
    return new_pos

print(go(2))#2
print(origin)#2  #改变了全局变量的值
print(go(3))#5
print(origin)#5
print(go(5))#10
print(origin)#10
#面向对象编程
class Tourist():
    origin = 0
    def pos(self,new_pos):
        self.origin += new_pos

tourist=Tourist()
print(tourist.origin)
tourist.pos(2)
print(tourist.origin)
tourist.pos(3)
print(tourist.origin)
tourist.pos(5)
print(tourist.origin)

相关文章

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • (9) python之闭包

    闭包闭包 = 函数 + 环境变量(函数定义的时候) 一个最简单的闭包 闭包不受外部变量影响 非闭包 闭包 闭包 只...

  • python闭包学习

    参考文章 python闭包python闭包一步一步教你认识Python闭包深入浅出python闭包

  • python高级之闭包

    python高级之闭包 什么是闭包? 闭包(closure)是函数式编程的重要的语法结构。闭包也是一种组织代码的结...

  • Python 入门之 闭包

    Python 入门之 闭包 1、闭包 (1)在嵌套函数内使用(非本层变量)和非全局变量就是闭包 (2)_ clos...

  • Python 闭包使用注意点

    1 Python 闭包 今天,聊下 python 的闭包。在函数编程中经常用到闭包。 闭包是什么,它是怎么产生的及...

  • 2018-08-24

    闭包实例: #/usr/bin/enc python3 ... #-*-coding:utf-9-*- def l...

  • python之闭包

    闭包的概念 在一些语言中,在函数中可以(嵌套)定义另一个函数时,如果内部的函数引用了外部的函数的变量,则可能产生闭...

  • Python之——闭包

    一直觉得这个概念糊涂,其实,只是名字让人觉得糊涂,实际上理解了也挺容易的。 内部函数对外部函数作用域里变量的引用(...

  • Python之闭包

    很多高级语言都支持闭包,面试的时候也可能会问到,这可以作为对Python水平的一个参考。先看看百科的解释: 在计算...

网友评论

      本文标题:(9) python之闭包

      本文链接:https://www.haomeiwen.com/subject/qxgztqtx.html