python 列表推导和生成器表达式的使用
作者:PythonMind 发布时间:2021-03-16 11:21:39
目录
序列
容器序列与扁平序列
不可变序列与可变序列
列表推导
生成器表达式
Tips
小结
序列
序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列。
容器序列与扁平序列
容器序列存放的是对象的引用,包括list、tuple、collections.deque。
扁平序列存放的是对象的值,包括str、bytes、bytearray、memoryview和array.array。
扁平序列的值是字符、字节和数值这种基础类型。
不可变序列与可变序列
不可变序列,包括tuple、str、bytes。
可变序列,包括list、bytearray、array.array、collection.deque、memoryview。
下图左边是父类,右边是子类,可以看出可变序列是从不可变序列继承来的,扩展了可变方法:
列表推导
Python语言魅力在于简洁,这能从最常见的创建列表体现出来,比如我们想把字符串"abc"转换成新列表["a", "b", "c"],常规写法:
symbols = "abc"
codes = []
for symbol in symbols:
codes.append(symbol)
print(codes) # ["a", "b", "c"]
用到了for循环和列表append方法。实际上可以不用append方法,直接:
symbols = "abc"
codes = [symbol for symbol in symbols]
这叫做列表推导,是更加Pythonic的写法。
无论是编写效率还是可阅读性,列表推导都更胜一筹,可以说是构建列表的快捷方式。但是不能滥用,通用原则是,如果列表推导的代码超过了两行,就要考虑用append了。这不是规定,完全可以凭借自我喜好来选择。
笛卡尔积是指多个序列中元素所有组合,我们用列表推导来实现笛卡尔积:
colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = [(color, size) for color in colors for size in sizes]
一行代码搞定!Life is short,use Python,list comprehension is wonderful,amazing。
注意这行代码有两个for循环,等价于:
for color in colors:
for size in sizes:
运行结果是:
[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
如果换一下顺序:
[(color, size) for color in colors for size in sizes]
等价于:
for size in sizes:
for color in colors:
运行结果是不同的,观察第2个元素:
[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
生成器表达式
一般接触到生成器时,都要讲yield
关键字,看似有点复杂,然而却很简单,生成器就像列表推导一样,只不过是用来生成其他类型序列的,比如元组:
symbols = "abc"
codes = (symbol for symbol in symbols)
它的语法非常简单,把列表推导的中括号[]换成小括号(),就可以了。
语法相似,本质上却有很大区别,我们试着用生成器表达式来实现笛卡尔积,看看会有什么变化:
colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = ((color, size) for color in colors for size in sizes)
运行结果是:
<generator object <genexpr> at 0x000001FD57D2DB30>
generator object,结果是一个生成器对象。因为生成器表达式在每次迭代时才会逐个产出元素,所以这里的结果并不是已经创建好的元组。列表推导才会一次性产生新列表所有元素。
通过迭代把生成器表达式结果输出:
for tshirt in tshirts:
print(tshirt)
('black', 'S')
('white', 'S')
('black', 'M')
('white', 'M')
('black', 'L')
('white', 'L')
生成器表达式可以提升程序性能,比如要计算两个各有1000个元素的列表的笛卡尔积,生成器表达式可以帮忙省掉运行for循环的开销,即一个包含100万个元素的列表。
yield作用和return差不多,后面会讲到。
Tips
本小节内容是我看《流畅的Python》第一遍时记录的知识点:
Python标准库用C实现了丰富的序列类型。
列表推导,就是指
a = [x for x in something]
这种写法。生成器表达式用于生成列表外的其他类型的序列,它跟列表推导的区别仅仅在于方括号换成圆括号,如
b = tuple(x for x in something)
。array.array('I', x for x in something)
,array构造方法的第一个参数指定了数组中数字的存储方式。for tshirt in [c, s for c in colors for s in sizes]
,列表推导会一次性生成这个列表,存储在内存中,占用资源。for tshirt in ('%s %s' for c in colors for s in sizes)
,生成器表达式只在循环时逐个产出元素,避免额外的内存占用,省掉了运行for循环的开销。
小结
本文首先介绍了序列的概念,然后演示了Python常规骚操作——列表推导,最后引出了生成器表达式这个看似复杂实则简单的语法。列表是可变的,它有个不可变的孪生兄弟,元组。
参考资料:
《流畅的Python》
来源:https://www.cnblogs.com/df888/p/14353340.html
猜你喜欢
- 本例子程序展示了长白山火山气体地球化学2002年观测数据中CO2和He两种气体元素深度的时间序列。程序中用到了常用的时间序列python数据
- 今天一个项目上需要,修改了一些属性,测试成功。<!--#include file="conn.asp"-
- 在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率更高。一.什么是推导式推导式是从一个或者多个迭
- PHP asXML()函数实例格式化 XML(版本 1.0)中的 SimpleXML 对象的数据:<?php $note=<&l
- 在防止sql注入这些细节出现问题的一般是那些大意的程序员或者是新手程序员,他们由于没有对用户提交过来的数据进行一些必要的过滤,从而导致了给大
- 我就废话不多说了,直接上代码吧!'''python对象销毁(垃圾回收)'''class Po
- 本文转自微信公众号:"算法与编程之美" Python用HBuilder创建交流社区APP 基于P
- 前言对于刚刚下载好的pycharm,初学者使用会有一些问题,这里将介绍关于字体,背景,这些简单的设置将会提升编程的舒适度(下面以PyChar
- SMTP协议首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮
- 本文实例为大家分享了python利用tkinter实现屏保的具体代码,供大家参考,具体内容如下import randomimport tki
- Django中获取text,password名字:<input type="text" name="na
- 今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,不过代码里纸牌J,Q,K,A几个数字被我替换成了11,12,13,14......主要是
- 1.闭包的定义和使用当返回的内部函数使用了外部函数的变量就形成了闭包闭包可以对外部函数的变量进行保存,还可以提高代码的可重用性实现闭包的标准
- 首先让我们看下 YUI 是如何处理的:var toObject = function(a) { var o = {
- 本人就职于一个本地门户网站,每天网站上的天气都得更新。久而久之感到相当麻烦,于是写了一个定时的新闻小偷,帖出来大家参考一下系统
- 要求:#出租车计费*************************************************************
- 可以直接跳到最后整体代码看一看是不是很少的代码!!!!思路:1. 数据的整合2. 图片的灰度转化3. 图片的二值转化4. 图片的轮廓识别5.
- Keras确实是一大神器,代码可以写得非常简洁,但是最近在写LSTM和DeepFM的时候,遇到了一个问题:样本的长度不一样。对不定长序列的一
- pipenv 是Kenneth Reitz大神的作品,能够有效管理Python多个环境,各种包。过去我们一般用virtualenv搭建虚拟环
- 这一版,对虹软的功能进行了一些封装,添加了人脸特征比对,比对结果保存到文件,和从文件提取特征进行比对,大体功能基本都已经实现,可以进行下一步