python3 第二十五章 - comprehensions(推导式)
推导式(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:
- 列表(list)推导式
- 字典(dict)推导式
- 集合(set)推导式
1、列表推导式
列表推导式提供一个生成列表的简洁方法。常见的应用是创建新列表,其中每个元素是应用于另一序列或可迭代的每个成员的一些操作的结果,或者创建那些满足特定条件的元素的子序列。
其基本格式如下:
variable = [out_exp_res for out_exp in input_list if out_exp == 2]
out_exp_res:列表生成元素表达式,可以是有返回值的函数。
for out_exp in input_list:迭代input_list将out_exp传入out_exp_res表达式中。
if out_exp == 2:根据条件过滤哪些值可以。过滤条件可有可无,取决于实际应用
例如,假设我们要创建一个平方数列表,如:
squares = []
for x in range(10):
squares.append(x**2) print(squares)
以上代码,输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意,上面这个创建(或者覆盖)了一个名为x的变量,它在循环结束时仍然存在。我们可以计算没有任何副作用的平方数列表:
squares = list(map(lambda x: x**2, range(10)))
或者,等价地:
squares = [x**2 for x in range(10)]
上面这个方法更加简明且易读。
列表推导式由一对方括号组成,方括号包含一个表达式,其后跟随一个for子句,然后是零个或多个for或if子句。结果将是一个新的列表,其值来自将表达式在其后的for和if子句的上下文中求值得到的结果。例如,如果这两个列表的元素不相等,则此listcomp组合两个列表的元素:
squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(squares)
它等效于:
squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y] for x in [1, 2, 3]:
for y in [3, 1, 4]:
if x != y:
squares.append((x, y)) print(squares)
注意这两个代码片段中,for和if语句的顺序是如何保持一致的。以上代码,输出:
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4), (1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
将推导式的[]改成()即可得到生成器:
squares = (x**2 for x in range(10))
print(type(squares))
以上代码,输出:
<class 'generator'>
列表推导式的第一个表达式可以是任何表达式,包括另外一个列表推导式,我们叫这种情况为嵌套的列表推导式。实例:
# 3×4矩阵的示例,其被实现为长度为4的3个列表的列表
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
] # 下面的列表推导式将转置行和列
res = [[row[i] for row in matrix] for i in range(4)] print(res)
以上代码,输出:
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
嵌套的列表推导式在它后面的for上下文中求值,所以这个例子等效于:
# 3×4矩阵的示例,其被实现为长度为4的3个列表的列表
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
] # 下面的列表推导式将转置行和列
transposed = []
for i in range(4):
transposed.append([row[i] for row in matrix]) print(transposed)
思考:求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表,下面给出代码但请尽可能先自己写出来:
res = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
print(res)
2、字典推导式
字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:
{ key_expr: value_expr for value in collection if condition }
实例,快速更换key和value:
data = {'a': 10, 'b': 34, 'c':100}
res = {v: k for k, v in data.items()}
print(res)
以上代码,输出:
{10: 'a', 34: 'b', 100: 'c'}
3、集合推导式
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:
{ expr for value in collection if condition }
实例:
squared = {x**2 for x in [1, 1, 2]}
print(squared)
以上代码,输出:
{1, 4}
python3 第二十五章 - comprehensions(推导式)的更多相关文章
- UNP学习笔记(第二十五章 信号驱动式I/O)
信号驱动式I/O是指进程预先告知内核,使得当某个描述符发生某事时,内核使用信号通知相关进程. 套接字的信号驱动式I/O 针对一个套接字使用信号驱动式I/O(SIGIO)要求进程执行以下3个步骤: 1. ...
- Gradle 1.12用户指南翻译——第二十五章. Scala 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- “全栈2019”Java多线程第二十五章:生产者与消费者线程详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第二十五章:流程控制语句中循环语句while
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 第二十五章 springboot + hystrixdashboard
注意: hystrix基本使用:第十九章 springboot + hystrix(1) hystrix计数原理:附6 hystrix metrics and monitor 一.hystrixdas ...
- 【第二十五章】 springboot + hystrixdashboard
注意: hystrix基本使用:第十九章 springboot + hystrix(1) hystrix计数原理:附6 hystrix metrics and monitor 一.hystrixdas ...
- C#图解教程 第二十五章 其他主题
其他主题 概述字符串使用 StringBuilder类把字符串解析为数据值关于可空类型的更多内容 为可空类型赋值使用空接合运算符使用可空用户自定义类型 Main 方法文档注释 插入文档注释使用其他XM ...
- WP8.1学习系列(第二十五章)——控件样式
XAML 框架提供许多自定义应用外观的方法.通过样式可以设置控件属性,并重复使用这些设置,以便保持多个控件具有一致的外观. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visua ...
- SpringBoot | 第二十五章:日志管理之自定义Appender
前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...
随机推荐
- Mysql时间差计算
Mysql如何计算两个时间字段的差值?可用函数 TIMESTAMPDIFF() ----------------------------- TIMESTAMPDIFF函数,有参数设置,可以精确到天(D ...
- Unable to locate appropriate constructor on class报错
在项目开发中,使用Hibernate里的JPA criteria查询,但是在写完之后使用时,会报错:Unable to locate appropriate constructor on class, ...
- loadrunner 关联函数web_reg_save_param
当我们每次访问网站都需要提交从服务器获取的动态文本时就会需要用到关联函数,就好像每次乘坐火车票我们都需要用最新的火车票,如果用旧车票就不能做火车,如果我们采用了录制时的旧动态码如usersession ...
- MemoryStream说明
MemoryStream 是内存流,为系统内存提供读写操作,由于 MemoryStream 是通过无符号字节数组组成的,可以说 MemoryStream 的性能可以算比较出色,所以它担当起了一些其他流 ...
- CSS预处器的了解
到目前为止,在众多优秀的CSS预处理器语言中就属Sass.LESS和Stylus最优秀,讨论的也多,对比的也多. 1.Sass背景介绍 Sass是对CSS(层叠样式表)的语法的一种扩充,诞生于2007 ...
- java命令--jstat 工具使用
jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具.他可以显示本地或远程虚拟机进程中的类装载.内存.垃圾收集.JIT编译等运行数据, ...
- Task的在主线程处理异常信息的Helper类
最近使用task时候需要把异常记录日志,直接注入非单例模式的实例进入异步线程,在高并发情况下会出现一些问题. 所以需要把异常反馈给主线程 ,并且不在主线程里进行等待,研究相关资料后,自己写了一个简单的 ...
- RPC web service
---------------------------------------------------------------------------------------------------- ...
- 关于python的正则表达式的例子
- jquery cdn bootstrap静态资源库问题
使用微软静态资源库 <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.9.0.min.js">&l ...