zoukankan      html  css  js  c++  java
  • lambda expression

    lambda 函数的语法只包含一个语句,表现形式如下:

    lambda [arg1 [,arg2,.....argn]] : expression
    

    expression 是一个参数表达式,表达式中出现的参数需要在 [arg......] 中有定义,并且表达式只能是单行的,只能有一个表达式

    lambda的特性:

       1)lambda 函数是匿名的:lambda函数没有名字。

       2)lambda 函数有输入和输出:输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。

       3)lambda 函数拥有自己的命名空间:不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。

    下面来看个例子:

    myAdd = lambda x, y: x + y
    print(myAdd(10, 20))
    

     lambda 表达式中的 x 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。如:

    x = 10
    a = lambda y: x + y
    x = 20
    b = lambda y: x + y
    print(a(10))  # 30
    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 表达式列表,并期望函数能在定义时就记住每次的迭代值。例如:

    funcs = [lambda x: x + n for n in range(5)]   # 这句是定义了一个表达式列表
    for f in funcs:
        print(f(0))    # 4 4 4 4 4
    
    """
    但是实际效果是运行是 n 的值为迭代的最后一个值。现在我们用另一种方式修改一下:
    """
    _funcs = [lambda x, n=n: x + n for n in range(5)]   # 这句是定义了一个表达式列表
    for f in _funcs:
        print(f(0))    # 0 1 2 3 4
    

      

  • 相关阅读:
    Modernizr使用指南(转)
    使用Func<>和Action简化委托
    实现类似MVC ViewBag类型的对象
    更改服务器的SID 加入域控制器提示SID重复
    SQL SERVER 执行大于80M的SQL 脚本
    完全关闭IIS日志,包括System32下的LogFile
    MVC不用302跳转Action,内部跳转
    SHA1l加密
    获取当前时间戳
    invoke反射
  • 原文地址:https://www.cnblogs.com/yanghh/p/13191180.html
Copyright © 2011-2022 走看看