zoukankan      html  css  js  c++  java
  • 匿名函数(lambda)在列表生成式和生成器中的应用示例

    匿名函数(lambda)在列表生成式和生成器中的应用示例

    列表生成式中实例

    先看题:

    以下代码的输出是什么?请给出答案并解释:

    def func():
        return [lambda x: x * i for i in range(4)]
    
    
    print([j(2) for j in func()])
    [6, 6, 6, 6]
    输出内容

    解释:

    函数 func() 中返回的是一个列表生成式,
    走到这个列表生成式时,列表中生成的是一个个函数对象,且此时经过循环,i = 3;

    Here We Go~~, 看下本质:

    # 把上述函数中的返回值(列表表达式)赋值给 val
    val = [lambda x: x * i for i in range(4)]
    # 打印val
    print(val)

    看下打印结果:

    [<function <listcomp>.<lambda> at 0x000002970C18B158>,
    <function <listcomp>.<lambda> at 0x000002970C18B1E0>,
    <function <listcomp>.<lambda> at 0x000002970C18B268>,
    <function <listcomp>.<lambda> at 0x000002970C18B2F0>]

    可以看到打印的结果是一个列表,里面放了4个函数对象;

    也就是说,在执行 print([j(2) for j in func()]) 时, 执行了 func() 函数(内部执行__call__()),

    func()函数返回值就是一个列表,里面放了4个函数对象;

    简单说,此时   print([j(2) for j in func()])  ==>  print([j(2) for j in "有四个函数对象的列表"])

    for 循环这个列表, 循环一次就走一次 j(2),也就是走一次拿一个函数(函数名后面加括号即调用该函数);

    所以最终输出 [6,6,6,6]

    生成器中实例

    变态后的需求

    ==> 请修改func的定义来产生期望的结果。

    (也就是修改上面的个函数,实现出题人预期的结果…………无f**k可说)

    def func():
        return (lambda x: x * i for i in range(4))
    
    
    print([j(2) for j in func()])
    [0, 2, 4, 6]
    输出内容

    对,两个函数的区别就是,一个是[ ]、一个是括号( );

    列表时返回的是一个列表生成式,括号时返回的是???

    解释:

    看下打印结果:

    由打印结果可以看到:

    val的数据类型是一个“生成器”对象,也即一个可迭代对象;

    所以,执行 return (lambda x: x * i for i in range(4)) 时,返回的直接是一个生成器对象(可迭代对象);

    根据特性,不向生成器要东西,它就不给你生,即里面的 i 还是最初始的0;

    但是,执行 return [lambda x: x * i for i in range(4)] 时,返回的是由列表生成式生成的一个列表;

    根据特性,列表猴急的一下就把列表生成了,即里面的 i 直接是个定值了;

     

  • 相关阅读:
    不要对父母说的十句话
    25句世界上最經典的話
    奥巴马(Obama)获胜演讲全文[中英对照]+高清视频下载
    【心理测试】男人眼中女人哪里最性感?
    一张图看出你是用左脑还是右脑
    我是有原则的~~(笑话转贴)
    各行各业常用大用大谎言
    你知道我今天为啥要来上班吗?
    女性抽烟腰会变粗?
    心理学家揭秘人临死时的感受
  • 原文地址:https://www.cnblogs.com/bigtreei/p/8993709.html
Copyright © 2011-2022 走看看