序列

序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列。

容器序列与扁平序列

容器序列存放的是对象的引用,包括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)

运行结果是:

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 列表推导和生成器表达式的使用的详细内容,更多关于python 列表推导和生成器表达式的资料请关注脚本之家其它相关文章!

python关键字列表的表达式,python 列表推导和生成器表达式的使用相关推荐

  1. Python 列表推导 、生成器表达式与声明式编程

    1.****列表推导********* 用到函数的一个常见的操作是将其用于列表的所有项,并使用结果创建一个新的列表.例如: # coding=utf-8 ''' ****列表推导********* 用 ...

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

    #开往春天新创作大赛# 前言 列表推导式构建列表的快捷方式,而生成器表达式则可以用来创建其他任何类型的序列.自python2.7以后,列表推导和生成器表达式的概念就应用到了字典上,所以就有了字典推导, ...

  3. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  4. format函数python生成列表_python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)...

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

  5. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  6. db2 语句包括不必要的列表_列表推导和生成器表达式的滥用

    列表推导是我在Python中最喜欢的功能之一.所以我写了一篇关于它们的文章进行讨论,并在PyCon 2018上进行了3小时的演讲论述. 虽然我很喜欢列表推导,但我发现一旦新的Pythonistas开始 ...

  7. 列表推导式 生成器表达式

    推导式 comprehensions(又称解析式):是 Python 中很强大的.很受欢迎的特性,具有语言简洁,速度快等优点 列表推导式 就是一个简单的公式,我们用这个列表推导式,把你好几行的for循 ...

  8. 列表推导和生成器表达式

    1 概念解释 列表推导是构建列表的快捷方式,生成器表达式可以用来创建其他任何类型的序列. 列表推导:放在方括号里的表达式,使用关键字for与in,通过处理和过滤一个或多个可迭代对象里的元素构建列表. ...

  9. 查看python关键字的方法,查看python关键字的方法

    查看python关键字的方法 作者:ikeycn 和 python 相关 简介:这是查看python关键字的方法的详细页面,介绍了和python,python 查看python关键字的方法有关的知识. ...

最新文章

  1. linux ptrace反调试之抢占ptrace
  2. 暗物质组成原理当然是不存在计算机,暗物质能组成生命吗?小部分暗物质可能会相互作用...
  3. 用符号方法求下列极限或导数matlab,实验7答案 Matlab符号计算
  4. Eclipse设置项目默认编码和换行符类型
  5. python 文档字符串_新款Python文档字符串生成器来了
  6. 文字识别_文字识别的应用
  7. [朴素妍][뭐라고 끝낼까][说什么结束]
  8. PPT 字体的玩法(师从于珞珈老师)
  9. 2021-2027全球与中国DJ设备市场现状及未来发展趋势
  10. macos蓝牙驱动和wifi驱动名称_win7蓝牙装不上?别急着捣鼓驱动软件啦!可能是硬件问题!...
  11. 电场在计算机专业的应用,电磁场毕业论文题目范文 数值计算和教学理论方面本科论文范文8000字...
  12. matlab截取图像像素,图像中获取图像的像素值
  13. 北京公司买车,都需要什么手续?摇号有什么特殊要求?
  14. Android对话框的使用总结
  15. 【Adobe Premiere Pro 2020】pr2020转场与过度的使用说明【批量修改图片时长、转场特效制作等】、时间轴及工具栏的使用说明、静态帧制作动态效果、制作影片曲线变速、PR消除画面抖动
  16. 人工智能/数据科学比赛汇总 2019.6
  17. Ansible Inventory内置参数
  18. 解决attempted relative import with no known parent package问题
  19. 掌握《网络》,见微才能知著
  20. codeforces 416C C. Booking System(贪心)

热门文章

  1. Python使用request包请求网页乱码解决方法
  2. 电气期刊论文实现:热电联产经济调度【有代码】
  3. JavaScript实现完整的ComplexNumber复数类(附完整源码)
  4. wxWidgets:wxVariantDataCurrency类用法
  5. wxWidgets:wxClipboardTextEvent类用法
  6. boost::safe_numerics模块实现检测到的数据类型溢出的测试程序
  7. boost::phoenix::lambda相关的测试程序
  8. 展示使用 boost bind 和 phoenix 处理删除的不同方法的测试程序
  9. boost::graph模块实现bellman的测试程序
  10. boost::fusion::result_of::empty用法的测试程序