匿名函数(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 直接是个定值了;
匿名函数(lambda)在列表生成式和生成器中的应用示例的更多相关文章
- CSIC_716_20191114【生成器、匿名函数、内置函数、三元表达式、列表生成式、生成器表达式】
生成器: 函数与yield连用,凡是函数中有yield的,调用该函数的时候均不会立即执行,而是会返回一个生成器. 生成器本质上是一个迭代器,需要通过 [生成器.__next__()]或者[nex ...
- Day4 函数、列表生成式、生成器、迭代器
温故而知新: 1. 集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 2. 元组 只读列表,只有count, index 2 个方法 作用:如果一些数据不想被人修改, 可以存成元 ...
- 【Python】python内置函数、列表生成式、生成器
一.内置函数 1 print(all([1,2,3,4]))#判断可迭代的对象里面的值是否都为真 2 print(any([0,1,2,3,4]))#判断可迭代的对象里面的值是否有一个为真 3 pri ...
- Python之列表生成式、生成器、可迭代对象与迭代器
本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterable.Iterator与Generator之间的关系 一.语法 ...
- 列表生成式、生成器&迭代器
一.列表生成式 先有列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,怎么实现? 方法一: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, ...
- 【转】Python之列表生成式、生成器、可迭代对象与迭代器
[转]Python之列表生成式.生成器.可迭代对象与迭代器 本节内容 语法糖的概念 列表生成式 生成器(Generator) 可迭代对象(Iterable) 迭代器(Iterator) Iterabl ...
- 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 ...
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- python学习笔记——列表生成式与生成器
1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行 ...
随机推荐
- linux时间同步-NTP服务
作者:曹世军链接:https://www.zhihu.com/question/30252609/answer/108840850来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- windows下安装vundle
windows下安装vundle ## 前言 windows下安装vundle和linux下稍微有些不一样,虽然官网给出了 安装说明,但是有些问题的. E117: Unknown function: ...
- 跟着百度学PHP[14]-PDO的预处理语句1
预处理语句有以下两个特点: 1.效率高 2.安全性好 为什么说预处理语句效率高呢? 预处理语句就好比一个模板,比如下面的一串插入语句: insert into admin(id,username,pa ...
- (译)Getting Started——1.2.4 Tutorial:Storyboard(故事板)
该教程是基于你在前面的课程中构建的项目上进行的.学完本教程后,你将使用你前面学到的视图.视图控制器.动作.导航的内容,还会为应用创建一些关键的用户界面,并在场景中添加行为 以下就是本节课的内容: 1. ...
- 分析并实现 360 P1路由器上的测速功能(也可以针对金山测速功能)
现在各种智能路由器以及一些PC上的防火墙软件,都提供网络测速功能.笔者对此进行了研究,并在自己的路由器上也实现了此功能.下面做一下总结 一般的网络测速,主要关注两个方面:网络延迟和下载速率 1.网络延 ...
- HDU1196 Lowest Bit
Lowest Bit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- linux输入法
sudo apt-get install fcitx-table-wbpy安装fcitx 中文是灰色的就拖到第一个 桌面右上角有个设置,可以添加拼音 拼音特别难用
- java语言中public、private、protected三个关键字的用法,重写和重载的区别。
java语言中public.private.protected三个关键字的用法,重写和重载的区别. 解答: 作用域 当前类 同包 子类 其它 public √ √ √ √ protected √ √ ...
- 嵌入式驱动开发之dsp fpga通信接口---spi串行外围接口、emif sram接口
-----------------------------------------author:pkf ------------------------------------------------ ...
- 组合使用QT的资源管理高级功能简化开发过程
使用 QT 进行团队开发的时候,常常碰到一个问题,就是如何共同管理资源?甚至一个人进行开发的时候如何简化资源的维护,避免无谓的消耗? 如果可以做到在开发的时候,大家把美工做的图片(往往是程序员先自己随 ...