美文网首页Python
lambda --定义匿名或内联函数 --并且实现绑定变量的值

lambda --定义匿名或内联函数 --并且实现绑定变量的值

作者: cook__ | 来源:发表于2018-10-04 13:46 被阅读6次

    问题:需要提供一个短小的回调函数为sort()这样的操作使用,但是又不想通过def语句编写一个单行的函数

    解决方案:像这种仅仅完成表达式求值的简单函数可以通过lambda表达式来替代
    # 示例1:
    add = lambda x, y: x + y
    print(add(1, 2))  # 3
    
    # 示例2:lambda表达式可用在如下的上下文环境中,比如排序或者对数据新进行整理时
    names = ['a', 'b', 'kj', 'iuo']
    print(sorted(names, key=lambda name: name.lower())) # ['a', 'b', 'iuo', 'kj']
    
    问题: 我们利用lambda表达式定义一个匿名函数,但是也希望可以在函数定义的时候完成对特定变量的绑定

    下面看下lambda表达式中是如何绑定变量的:

    # 示例1:
    x = 10
    a = lambda y: x+y
    x = 20
    b = lambda y: x+y
    
    print(a(10))  # 30  # 原因分析:lambda表达式中用到x是一个自由变量,在运行的时候绑定而不是定义的时候绑定
    print(b(10))  # 30
    
    解决方案:如果希望匿名函数可以在定义的时候绑定变量,并且保持值不变,那么可以将那个值作为默认参数实现
    x = 10
    a = lambda y, x=x: x+y
    x = 20
    b = lambda y, x=x: x+y
    print(a(10))  # 20
    print(b(10))  # 30
    

    本节中提到的问题较容易出现在对lambda函数过于聪明的应用上。比方说,通过列表推导来创建一列lambda表达式,实例代码如下:

    funds = [lambda x: x+n for n in range(3)]
    for f in funds:
        print(f(0))  # 2, 2, 2
    
    funds = [lambda x, n=n: x+n for n in range(3)]  # 给个默认参数,在定义lambda匿名函数的时候就把n绑定了
    for f in funds:
        print(f(0))  # 0, 1, 2
    

    相关文章

      网友评论

        本文标题:lambda --定义匿名或内联函数 --并且实现绑定变量的值

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