zoukankan      html  css  js  c++  java
  • python3 之 闭包实例解析 Be

    一、实例1:

     1 def make_power(y):
     2     def fn(x):
     3         return x**y
     4     return fn
     5 
     6 pow3 = make_power(3)
     7 pow2 = make_power(2)
     8 pow100 = make_power(100)
     9 
    10 print('3的3次方=',pow3(3),"\t")
    11 print('3的2次方为:',pow2(3),"\t")
    12 print('3的100次方为:',pow100(3),"\t")

    二、实例2(面试题):

    #下面这段代码的输出结果是什么?请解释:
    #代码:
    def multipliers():
        return [lambda x: i * x for i in range(4)]
    print([m(2) for m in multipliers()])
    #输出结果:[6,6,6,6] #(不是我们想要的[0,2,4,6])
    #原因:
    #上述问题产生的原因是Python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。
    #因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3。

    解决办法:

      方法1:python生成器  

    def multipliers():
        for i in range(4):yield lambda x:x*i
    
    print([m(2) for m in multipliers()])  #[0,2,4,6]

      方法2:

    def multipliers():
        return [lambda x,i = i :i*x for i in range(4)]
    print([m(2) for m in multipliers()])  #[0,2,4,6]
  • 相关阅读:
    规划分类
    java 命名空间
    何为"IOE"、"去IOE"
    vSphere 6.7 新特性 — 基于虚拟化的安全 (VBS)
    RHCE
    VCPU的解释
    VMware vSphere学习整理
    Vmware
    Linux启动
    Linux相关笔记
  • 原文地址:https://www.cnblogs.com/gengyufei/p/11316442.html
Copyright © 2011-2022 走看看