zoukankan      html  css  js  c++  java
  • Python 之 for循环中的lambda

    第一种

    f = [lambda x: x*i for i in range(4)]  (如果将x换成i,调用时候就不用传参数,结果都为3)

    对于上面的表达式,调用结果:

    >>> f = [lambda x:x*i for i in range(4)]
    >>> f[0](1)
    3    # 1*3
    >>> f[1](1)
    3    # 1*3
    >>> f[2](1)
    3    # 1*3
    >>> f[3](1)
    3    # 1*3
    >>> f[0](3) 9 # 3*3 >>> f[1](3) 9 # 3*3 >>> f[2](3) 9 # 3*3 >>> f[3](3) 9 # 3*3

    上面的表达式展开如下:

    1 def func():
    2     fs = []
    3     for i in range(4):
    4         def lam(x):
    5             return x*i
    6         fs.append(lam)
    7     return fs

    当调用 func() 时,每循环一次,将 lam 函数的地址存到 fs 中。因为在每次循环中 lam函数都未绑定 i 的值,所以直到循环结束,i 的值为3,并将 lam 中所用到的 i 值定为 3 ,因此真正调用(例如f[0](3))的时候 i 值保持不变(为3)。

    展开后的调用方法:

    >>> def func():
    ...     fs = []
    ...     for i in range(4):
    ...         def lam(x):
    ...             return x*i
    ...         fs.append(lam)
    ...     return fs
    ... 
    >>> f = func()
    >>> f[0](3)
    9
    >>> f[2](3)
    9
    >>> f[1](3)
    9

    另一种将x换成i,就与传入的x值无关了。(这里 lambda 后面什么参数都不跟)

    >>> f = [lambda :i*i for i in range(4)]
    >>> f[0]()
    9
    >>> f[1]()
    9   
    >>> f[2]()
    9   
    >>> f[3]()
    9 

    解释同上面。

    第二种

    f1 = [lambda i=i: i*i for i in range(4)] 

    对于上面的表达式,调用结果:

    >>> f1 = [lambda i=i: i*i for i in range(4)]
    >>> f1[0]()
    0
    >>> f1[1]()
    1
    >>> f1[2]()
    4
    >>> f1[3]()
    9

    上面的表达式展开如下(为了更直观,替换了变量):

    1 def func():
    2     fs = []
    3     for i in range(4)
    4         def lam(x=i):   # 即 i=i
    5             return x*x    # 即 i*i
    6         fs.append(lam)
    7     return fs

    当调用 func() 时,每循环一次,将 lam 函数的地址存到 fs 中。但是在每次循环中 lam函数都将 i 值绑定到了 x 上,所以直到循环结束,不同地址的 lam 函数的 x 值为都不一样,因此真正调用(例如 f[0]())的时候 x 值都为当时被绑定的值。

    但如果给 lam 函数传了参数,例如 f[0](8),那么所有的调用结果都为传参的平方。与上面解释并不冲突,只是将传的参数绑定到了 x 上。

    >>> f1 = [lambda i=i: i*i for i in range(4)]
    >>> f1[0](8)
    64
    >>> f1[1](8)
    64
    >>> f1[2](8)
    64
    >>> f1[3](8)
    64

    最后一种

    f2 = [lambda x=i: i*i for i in range(4)]

    哈哈哈哈,和第二种好像,只是变了一个字符,那么结果就大不一样了,哈哈哈哈

    对于上面的表达式,调用结果:

    >>> f2 = [lambda x=i: i*i for i in range(4)]
    >>> f2[0]()
    9
    >>> f2[1]()
    9
    >>> f2[2]()
    9
    >>> f2[3]()
    9
    >>> f2[0](7)
    9
    >>> f2[1](7)
    9
    >>> f2[2](7)
    9

    传不传参数都不影响结果。展开后:

    1 def func():
    2     fs = []
    3     for i in range(4)
    4         def lam(x=i):  
    5             return i*i  
    6         fs.append(lam)
    7     return fs

    虽然 lam 函数将 i 的值绑定到了 x 上,但函数体中并未使用 x,所以直到循环结束,i 的值变为3,才会在调用时使用。其实同第一种情况是一样的。

    最后:我写的也好乱,还是多试试吧。

  • 相关阅读:
    【模板】快速幂&取余运算
    【模板】ST表
    LOJ #10070 最小生成树计数
    【模板】KMP字符串匹配
    PL/SQL编程要点和注意点
    数据不同方式的提取和提交的性能测试(转载)
    Oracle分析函数之开窗子句-即WINDOWING子句
    Oracle树反向查询的优化(转载)
    oracle默认的hr用户使用脚本安装
    展开BOM并使用最终用量的算法(转载)
  • 原文地址:https://www.cnblogs.com/liuq/p/6073855.html
Copyright © 2011-2022 走看看