#开往春天新创作大赛#

前言

列表推导式构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列。自python2.7以后,列表推导和生成器表达式的概念就应用到了字典上,所以就有了字典推导,以后我们还会遇到集合推导(此处暂不讨论)。因此,如果想要更好的学习字典推导,需要对列表推导和生成器表达式进行充分对掌握。

为什么使用推导式,推导式的应用让代码的可读性更强。接下来,我们就一同来验证为什么说“可读性更强”。

列表推导

示例1:把letter字符串变成Unicode码位的列表

In [1]: letter='abcdefghr'In [2]: codes=[]In [3]: for letter in letter:    ...:     codes.append(ord(letter))    ...:     In [4]: codesOut[4]: [97, 98, 99, 100, 101, 102, 103, 104, 114]

示例2:把letter字符串变成Unicode码位的列表的另外一个写法(即列表推导)

In [1]: letter='abcdefghr'In [2]: codes=[ord(letter) for letter in letter]In [3]: codesOut[3]: [97, 98, 99, 100, 101, 102, 103, 104, 114]

如上两个示例,最终达到的效果是一致的。但是明显可以看出,示例2的可读性更强。大家可能会问,是不是以后就使用列表推导不再使用for循环来呢?其实不然。通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。如果列表推导的代码超过了两行,可能就要考虑是不是要用for循环重写了。实际上,没有硬性规则要求什么时候用什么,或者必须用什么,如何用怎么用,还是需要自己把握。

生成器表达式

与列表推导相比,生成器表达式是初始化元组、数组或其他序列类型的更好选择。原因是生成器表达式遵守了迭代器协议,它是逐个的产出元素,而不是构造完整列表后,把列表传递到函数里。生成器表达式与列表推导的语法差不多,不同的是列表推导使用方括号,而生成器表达式使用的是圆括号

示例1:使用生成器表达式初始化元组和数组

#初始化元组In [1]: letter='abcdefghr'In [2]: tuple=tuple(ord(letter) for letter in letter)In [3]: tupleOut[3]: (97, 98, 99, 100, 101, 102, 103, 104, 114)#初始化数组In [4]: import arrayIn [5]: array.array('I',(ord(letter) for letter in letter))Out[5]: array('I', [97, 98, 99, 100, 101, 102, 103, 104, 114])

如果生成器表达式是函数调用的唯一参数,则不需要再加另外一个圆括号。

array的构造方法有两个参数,第一个参数确定了数字的存储方式。与初始化元组不同,该处有两个参数,所以生成器表达式需要用圆括号括起来。

字典推导

字典推导可以从任何以键值对作为元素的可迭代对象中构建出字典。

下面例子就展示了利用字典推导可以把一个装满元组的列表变成两个不同的字典。

创建一个包含成对数据的data_name列表,它将直接用在后续字典的构造方法中,具体如下:

In [1]: data_name=[(1561,'祁俊超'),(1560,'邓亚鑫'),(1559,'黎荣梅'),(1557,'卢雪'),                   (1556,'武晓蒙'),(1555,'黄国全'),(1554,'黎荣梅'),(1551,'姚文通'),                   (1550,'曾丹丹'),(1548,'武晓蒙')]In [2]: data_nameOut[2]: [(1561, '祁俊超'), (1560, '邓亚鑫'), (1559, '黎荣梅'), (1557, '卢雪'), (1556, '武晓蒙'), (1555, '黄国全'), (1554, '黎荣梅'), (1551, '姚文通'), (1550, '曾丹丹'), (1548, '武晓蒙')]

更改data_name列表中数据对的左右位置,姓名为键,编号为值。具体如下:

In [3]: name_code={name:code for code,name in data_name}In [4]: name_codeOut[4]: {'祁俊超': 1561, '邓亚鑫': 1560, '黎荣梅': 1554, '卢雪': 1557, '武晓蒙': 1548, '黄国全': 1555, '姚文通': 1551, '曾丹丹': 1550}

同上面的操作相反,用编号为键,姓名为值,并且过滤掉编号大于或等于1560的姓名。具体如下:

In [5]: {code:name for name,code in name_code.items() if code>=1560}Out[5]: {1561: '祁俊超', 1560: '邓亚鑫'}

如果对列表推导对概念以及书写方式已熟知,那么理解字典推导相对容易些。如果对列表推导还不熟知,那么现在应该是掌握它导时候了,因为字典推导表达形式在其他数据类型中慢慢得以体现。同时,使用列表推导和字典推导可以实现对数据的过滤效果

「python好书推荐」

mysql数据字典生成器_「python技术」列表推导、生成器表达式和字典推导的差异及其示例相关推荐

  1. sap 标准委外和工序委外_「SAP技术」SAP MM 委外加工采购流程里副产品的收货

    「SAP技术」SAP MM 委外加工采购流程里副产品的收货 委外加工采购流程,在很多SAP项目里都有. 其标准流程是: 我方因受限于生产工艺或者生产产能不足,或者降低生产成本的缘故,需要寻找外部加工商 ...

  2. 一致 先验分布 后验分布_「分布式技术」分布式事务最终一致性解决方案,下篇...

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 上 ...

  3. python编程a的x次方_「Python 面试」第四次更新

    阅读本文大约需要 5 分钟. 15.说一说 GIL 前面有提到由于 Python 基于 C 语言编写的解释器中设置了一个 GIL 全局变量锁,该锁使得 Python 的多线程在处理 CPU 计算密集型 ...

  4. python 不显示前几个字符_「Python 秘籍」删除字符串中不需要的字符

    艺赛旗RPA2020.1版本 正在免费下载使用中,欢迎下载使用 艺赛旗-RPA机器人免费下载|提供流程自动化解决方案​www.i-search.com.cn 了解RPA请访问 艺赛旗-RPA机器人免费 ...

  5. python文件之间的相互调用_「Python 系列」 Python 生成器函数详解

    Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...

  6. python input输入多个变量_「Python 秘籍」1.2 解压可迭代对象赋值给多个变量

    问题 需要从某个可迭代对象中分解出 N 个元素,但是这个可迭代对象的长度可能超过 N,这会导致出现"需要解包的值过多(too many values to unpack)"的异常. ...

  7. python中的与或非_「Python基础」 While 循环语句

    Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行语句可以是单个语句或语句 ...

  8. python 教学_「Python基础」一次就装好Python手把手装到好

    一.前言: 安装Python有两个主要的方法,视情况而定我两个都会用: (1)安装 Anaconda Anaconda像一个懒人包,安装它等于把Python安装好连同把Python大部分的套件也下载好 ...

  9. python闹钟界面程序_「Python编程」自由管理时间之编写一个小闹钟起床

    Python_时间管理 代码中的时间时间戳(Timestamp):1473525444 时间字符串(Format String):2015-02-14 11:25:11 结构化时间:(struct_t ...

最新文章

  1. three.js学习资料整理
  2. 神策营销云:「在线教育」行业,如何借“运营工具”玩转微信生态?
  3. JavaScript中的一些细节
  4. 招不到电子工程师,这锅谁来背?
  5. 基于 Roslyn 实现动态编译
  6. springBoot配置,贴个图
  7. fatal error: openssl/evp.h: 没有那个文件或目录
  8. [导入]DataHelper
  9. 为什么base64编码的字符串的末尾有=符号
  10. mysql 拼音首字母排序
  11. Dev C++下载简介和安装
  12. 如何利用Photoshop制作电子签名
  13. 百度地图jsApi,地图拖动,中心定位图标不动,准确获取拖动过后中心定位图标所在位置
  14. 手撸spring源码分析IOC实现原理
  15. 我在创业公司的 “云原生” 之旅
  16. 软考中级---系统集成项目管理
  17. 如何1分钟实现身份实名认证功能?
  18. 基于网络特征的新型授权机制设想
  19. 1055. The World's Richest (25)
  20. python 爬取5566图库图片

热门文章

  1. C#LeetCode刷题之#190-颠倒二进制位(Reverse Bits)
  2. C#LeetCode刷题之#459-重复的子字符串(Repeated Substring Pattern)
  3. 为什么我切换到React Native来创建超级简单的底页
  4. Node.js:它是什么,何时以及如何使用它,以及为什么要使用它
  5. 使用canvas元素和JavaScript花费您的星期日(或任何一天)。
  6. 109_Power Pivot客户ABC(帕累托)分析度量值写法(非计算列)
  7. Spring MVC中的基本流程
  8. 使用TA-Lib在vn.trader上开发CTA交易策略
  9. php int类型思索
  10. Python3 装饰器解析