匿名函数(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 直接是个定值了;

匿名函数(lambda)在列表生成式和生成器中的应用示例的更多相关文章

  1. CSIC_716_20191114【生成器、匿名函数、内置函数、三元表达式、列表生成式、生成器表达式】

    生成器: 函数与yield连用,凡是函数中有yield的,调用该函数的时候均不会立即执行,而是会返回一个生成器. 生成器本质上是一个迭代器,需要通过    [生成器.__next__()]或者[nex ...

  2. Day4 函数、列表生成式、生成器、迭代器

    温故而知新: 1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 2. 元组 只读列表,只有count, index 2 个方法 作用:如果一些数据不想被人修改, 可以存成元 ...

  3. 【Python】python内置函数、列表生成式、生成器

    一.内置函数 1 print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真 2 print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真 3 pri ...

  4. Python之列表生成式、生成器、可迭代对象与迭代器

    本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...

  5. 列表生成式、生成器&迭代器

    一.列表生成式 先有列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,怎么实现? 方法一: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, ...

  6. 【转】Python之列表生成式、生成器、可迭代对象与迭代器

    [转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...

  7. python 之 列表生成式、生成器表达式、模块导入

    5.16 列表生成式 l=[]for i in range(100):    l.append('egg%s' %i)print(l)​l=['egg%s' %i for i in range(100 ...

  8. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

  9. python学习笔记——列表生成式与生成器

    1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行 ...

随机推荐

  1. 安装好Oracle和PLSQLDeveloper后,PLSQLDeveloper登录时没有可选数据库和连接为问题

    1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...

  2. SOCK_RAW编程

    TCP(SOCK_STREAM)和UDP套接口(SOCK_DGRAM)可以满足大部分需求,但要获取底层协议内容就需要原始套接字.相比前两者,SOCK_RAW具有如下优点: 1)使用原始套接字可以读写I ...

  3. 截图工具gsnap

    嵌入式linux截图工具的基本原理就是通过读取Framebuffer,把LCD上显示的内容转换成图片格式文件(jpeg.bmp.png). gsnap.bin 1.jpg  /dev/fb0 gsna ...

  4. CRM认识的误区

    众所周知,CRM,就是平时说的“客户关系管理”,指用CRM来管理 企业与客户之间的关系.纵观整个IT圈子,做CRM的厂商比比皆是,每个厂商都有自己的产品宣言,令人眼花缭乱.但是领很多老板们不解的是,我 ...

  5. .NET程序调试技巧(一):快速定位异常的一些方法

    作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...

  6. 该如何将MathType公式粘贴到文档中

    MathType是一款非常好用的数学公式编辑器,因为它与很多的文档处理器都能够很好地兼容,因此其使用范围非常的大.MathType公式编辑器编辑的公式与数学符号等都符号国际期刊的出版标准,并且上手容易 ...

  7. 第十篇:顺序容器vector,deque,list的选用规则

    前言 常见的顺序容器主要有三种 - vector,deque,list.它们实现的功能相差不大,那么实际开发中该如何进行选择呢?本文将为你解答这个问题. 分析 由于这三种容器实现的数据结构原型不同(v ...

  8. tomcat报错-----》Unable to open debugger port IDEA Unable to open debugger port

    原因:IDEA配置的端口被占用了 解决方法: 方法一: 查找idea配置的调试端口--查看占用该端口的进程--杀掉进程 方法二:查找idea配置的调试端口--修改调试端口(未被使用的) 基本步骤: 1 ...

  9. poj 2923(状态压缩+背包)

    比较巧妙的一道题目,拿到题目就想用暴力直接搜索,仔细分析了下发现复杂度达到了2^n*n! ,明显不行,于是只好往背包上想. 于是又想二分找次数判断可行的方法,但是发现复杂度10^8还是很悬... 然后 ...

  10. 【BZOJ4592】[Shoi2015]脑洞治疗仪 线段树

    [BZOJ4592][Shoi2015]脑洞治疗仪 Description 曾经发明了自动刷题机的发明家SHTSC又公开了他的新发明:脑洞治疗仪--一种可以治疗他因为发明而日益增大的脑洞的神秘装置. ...