• 循环闭包函数打印列表


    #_*_ encoding: utf-8 _*_   @author: ty  hery   2019/9/6
    
    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 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用
    的时候被查找。所以结果是,当任何 multipliers() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作
    用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回
    的函数 multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x
    2)。(顺便说下,正如在 The Hitchhiker’s Guide to Python 中指出的,这里有一点普遍的误解,是关于
    lambda 表达式的一些东西。一个 lambda 表达式创建的函数不是特殊的,和使用一个普通的 def 创建的函数
    展示的表现是一样的。)
    这里有两种方法解决这个问题。
    https://www.cnblogs.com/xuchunlin/p/6049371.html 4/61'''
    # 最普遍的解决方案是创建一个闭包,通过使用默认参数立即绑定它的参数。例如:
    def multipliers():
        return [lambda x, i=i : i * x for i in range(4)]
    print ([m(2) for m in multipliers()])
    
    # 另外一个选择是,你可以使用 functools.partial 函数:
    from functools import partial
    from operator import mul
    def multipliers():
        return [partial(mul, i) for i in range(4)]
    print ([m(2) for m in multipliers()])
    
    输出:
    [6, 6, 6, 6]
    [0, 2, 4, 6]
    [0, 2, 4, 6]
    

    lambda字典

    # ============== lambda字典 ===================
    # # 替换多重 if.. elif
    fun_dict = {
        'add': lambda a, b: a + b,
        'sub': lambda a, b: a - b,
        'mul': lambda a, b: a * b,
        'dev': lambda a, b: a / b
    }
    operator = 'mul'
    a, b = 5, 2
    #
    # # 通过key来调用lambda表达式进行计算, 替换多重if...elif...操作
    result = fun_dict.get(operator)(a, b)
    print(result)
    
    写入自己的博客中才能记得长久
  • 相关阅读:
    Spark基础
    flink杂记
    算法
    算法小结
    Java内存模型
    LeetCode---Backtracking && DP
    LeetCode---Sort && Segment Tree && Greedy
    LeetCode---Depth-first && Breadth-first
    LeetCode---Bit Manipulation && Design
    MD5
  • 原文地址:https://www.cnblogs.com/heris/p/14642412.html
Copyright © 2020-2023  润新知