Python成长记十三(闭包)

函数式编程中的一种---闭包

1、python中一切皆对象

  例如:
   (1)函数可作为一个对象 
   (2)可作为一个函数的参数,传递到另外的函数里

   (3)把一个函数当做另外一个函数的返回结果

 案例:
    def demo():
          pass
    print(type(demo))
    结果:<class 'function'>


2.闭包

 定义:由函数和环境变量构成
 案例1:
    def a():
        m =25
        def b(x):
              return m*x*x
    return b
m = 10
f = a()
print(f.__closure__)
print(f.__closure__[0].cell_contents)
print(f(2))
   结果:
    (<cell at 0x000001CCE3FA0F78: int object at 0x0000000056D1D1F0>,)
25
100


案例2:
    def demo():
    a =10
    def demo2():
        a =20
        print(a)
    print(a)
    demo2()
    print(a)
    demo()
结果:10 20 


3.闭包的常见误区

案例1:

 def demo():

            a = 10
            def demo2():
                  # a为局部变量
                   a = 20
                   return a
            return demo2
  f = demo()
  print(f)
print(f.__closure__)
结果:
  <function demo.<locals>.demo2 at 0x000002026DCF5AE8>
      None


   案例2:
        def demo():
    a = 10
    def demo2():
       # a为局部变量
       # a = 20
        return a
    return demo2
f = demo()
print(f)
print(f.__closure__)
结果:
<function demo.<locals>.demo2 at 0x00000284F14B5AE8>

     (<cell at 0x00000284F0D30F78: int object at 0x000000005874D010>,)

     结论:a被python认为是一个局部变量

   案例3:求距离
                 x = 0
def distance(step):
    dis = x + step
    x = dis
    return x
print(distance(1))
print(distance(2))
print(distance(3))

结果:报错

案例4:
        x = 0
def distance(step):
    global x
    dis = x + step
    x = dis
    return dis
print(distance(1))
print(distance(2))

print(distance(3))

结果:1  3  6
总结:加global将x声明为全局变量(保证x不能被同时赋值)

      案例5:(使用闭包解决问题)
    x = 0
def distance(pos):
    def go(step):
        #声明pos不是本地变量
        nonlocal pos
        dis = pos + step
        pos = dis
        return dis
    return go
t = distance(x)
print(t(2))
print(t(3))
print(t(5))
结论:2 5 10
总结:使用关键字nonlocal声明pos为非本地变量
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值