1 解析式

从一个问题来看解析式,现有如下需求:生成一个列表,元素0-9,对每一个元素自增1后求平方返回新列表。

看起来很容易理解,但是这种需求竟然用了5行代码!下面来看一下列表解析式的写法。

看起来非常简洁,属于Python的风格!哈哈

再来看一下,什么是列表解析式?在Python中列表解析式是一种语法糖,虽然对看似复杂的代码进行了简写,但是编译器会进行优化,不会因为简写而影响效率,反而因为优化提高了效率。另外还介绍了代码量,减少了出错的机会,还简化了代码,增加了代码可读性。

2 列表解析式

列表解析式的基本语法是如下

[ 返回值for元素in可迭代对象if条件]

使用中括号将表达式(推导式)括起来

内部是for循环,if条件可选,可以是多个但是不支持elif语句

返回一个新的列表

有这样的赋值语句 newlist = [ print(i) for i in range(10) ],请问newlist打印出来是什么?

为什么是None?因为表达式只会将函数的返回值作为结果,进行添加,所以当返回值是一个函数操作的对象时,一定要注意函数的返回值!

2.1 列表解析式进阶

有的时候我们的代码需要进行两个或多个循环,列表解析式进阶版本可以满足这种需求哦。它的语法是:

条件表达式可以是多个,但是不能是elif,多个if是并且的关系

多个循环条件等同于循环嵌套,时间复杂度是O(n*内层循环个数)

例子:

3 其他解析式

除了列表解析式以外,Python中还存在集合解析式、字典解析式、'元组解析式'。

可不是什么元组解析式,这行小字你看不到,可不怪我哦。

3.1 集合表达式

语法:{ 返回值 for 元素 in 可迭代对象 if 条件 }

列表解析式的中括号换成大括号{}即可

同样是立即返回一个集合

注意集合的特性,如果生成了不可hash的元素比如list,那么是不能生成集合的哦,如果元素重复,集合会去重的哦

3.2 字典解析式

语法:{ 返回值(key:value) for 元素 in 可迭代对象 if 条件 }

列表解析式的中括号换成大括号{}即可

请使用key:value格式

立即返回一个字典

注意字典的key相同时,后面的赋值会把之前的值覆盖哦,所以结果是{'a': 9, 'b': 9, 'c': 9, 'd': 9, 'e': 9, 'f': 9}

4 生成器表达式

如果你是从上倒下看的,那么你可能会奇怪,说好的元组表达式呢?如果你是直接跳转过来的,那么请忽略前面这句话。那什么是生成器表达式呢?

生成器表达式是按需计算(或者惰性求值、延迟计算)的,只有需要的时候才计算值,而列表解析式是直接返回一个新的列表,生成器是一个可迭代对象,迭代器。在使用type命令判断对象类型时,generator 就表示一个生成器对象

语法:( 返回值 for 元素 in 可迭代对象 if 条件表达式 )

列表解析式的中括号换成大括号()即可

延迟计算(惰性计算)

只能迭代一次,不能回头

4.1 特点

没错,用括号括起来的并不是元组表达式,而变成了生成器表达式,它本身由于惰性计算的特性和其他解析式有很多不同的特性

计算方式

生成器表达式延迟计算(惰性计算),只有你去向它要,它才会给你计算,而列表解析式在你执行后,会直接给你生成一个新的列表。

内存占用

生成器没有数据,内存占用极少,它是使用时一个一个返回数据,如果将这些返回的数据合起来占用的空间也和列表解析式差不多,但是它不是立即需要这么多空间

计算速度

单看计算时间来看,生成器表达式耗时非常短,列表解析式时长,因为生成器本身并没有任何返回值,只是返回了一个生成器对象,列表解析式构造并返回了一个新的列表,所以看起来更耗时了

遍历

当我们需要对数据进行遍历时,由于生成器是遍历一次计算一个返给你,而列表解析式执行完毕后直接返回一个新的列表不需要计算,所以性能要优于生成器表达式。

4.2 next函数

除了遍历我们还可以通过next方法来一次一次的获取生成器的数据

next()可以理解为向生成器要一次数据(拨一下生成器),当生成器为空时,就会提示StopIteration异常,for循环帮我们对StopIteration异常做了处理,还没有学习异常处理的我们,该怎么办呢?其实next方法为我们提供了默认值参数,即从生成器中拿不到数据,就返回指定的默认: next(g[, default])。

5 总结

Python2 引入列表解析式,Python2.4引入生成器表达式,Python3 引入集合、字典解析式,并迁移到了Python 2.7,一般来说,应该多用解析式,简短、高效不过还需要注意的是:

如果一个解析式非常复杂,难以读懂,可以考虑拆成for循环,没必要非要网列表解析式上靠

生成器和迭代器是不同的对象,但都是可迭代对象

可迭代对象范围更大,都可以使用for循环遍历

Python列表解析式-生成器相关推荐

  1. Python - 列表解析式/生成器表达式

    列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_e ...

  2. python 列表解析式_python列表解析式,字典解析式,集合解析式和生成器

    一.列表解析式(列表推倒式): 功能:是提供一种方便的列表创建方法,所以,列表解析式返回的是一个列表. 1 lst = [1, 3, 5, 8, 10] 2 ll = [x+x for x in ls ...

  3. python列表解析式如何使用_python列表解析式,生成器,及部分内建函数使用方法...

    标准库datetime 需要导入datetime模块: import datetime datetime模块: 对日期,时间,时间戳的处理 datetime的类方法 today  () now(tz= ...

  4. python列表解析式如何使用_python列表推导式操作解析

    python列表推导式操作解析 这篇文章主要介绍了python列表推导式操作解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本格式 ​[表达式 ...

  5. Python列表解析式,还支持异步?你知道吗?

    摘要 PEP-492 和 PEP-525 通过 async/await 语法,引入了对原生协程和异步生成器的支持.本 pep 提议给列表.集合.字典解析式和生成器表达式添加异步的版本. 基本原理和目标 ...

  6. 超详细,Python列表解析式到底该怎么用?

    Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法. 在本文中,将会展示列表解析式(List Comprehension).我们将讨论如何使用它?什么时候该或不该使 ...

  7. python列表解析式_Python基础入门-列表解析式

    今天我们使用Python中的列表解析式来实现一些简单功能.好了关于列表解析式是什么?我的理解是它可以根据已有列表,高效创建新列表的方式.列表解析是Python迭代机制的一种应用,它常用于实现创建新的列 ...

  8. Python列表解析式总结

    前言 目录 前言 什么是列表解析式? 从循环到解析式 列表解析式:可视化解读 无条件子句的列表解析式 嵌套循环 其他解析式 还要注意可读性 列表解析式 List comprehension 带嵌套循环 ...

  9. [python] 列表解析式的高效与简洁

    方法一(列表解析式): list1 = ["abc","efg","hij"] list2 = [i[0] for i in list1] ...

  10. python列表生成器语法_Python 列表生成式\生成器

    Python 列表生成式+生成器 一.列表生成式 1.什么是列表生成器 一种可以便捷地生成列表的表达式,有时候可以替换list.append(变量) 2.需求. 如何将列表中的每个数据都加1 列表:d ...

最新文章

  1. BERT重夺多项测试第一名,改进之后性能追上XLNet,现已开源预训练模型
  2. RESTORE DATABASE的standby选项
  3. 【2018ACM山东省赛 - C】Cities(最小生成树变形优化,贪心思维)
  4. 代码 抠图_3 行 Python 代码 5 秒抠图的 AI 神器,根本无需 PS
  5. Chrome浏览器导入证书(谷歌浏览器导入burpsuite证书)
  6. 【lucene】入门级
  7. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_8 Mybatis中的返回值深入-调整实体类属性解决增和改方法的报错...
  8. 各种Python简单功能代码
  9. 中国省市县JSON字符串(String)数据、2020年的数据、2021年12月整理
  10. 【剑指Offer(专项突击版)】001~059题目题解汇总
  11. 基于Springboot+Vue实现前后端分离进销存管理系统
  12. 《鹰猎长空》看世界范围内电影票价上涨的原因
  13. 青少年学习python有什么用_青少年为什么要学习Python
  14. 自定义通用信号处理核心板CMB-2C6657-1K7
  15. #217-[哈希]好人卡
  16. java数字音频最强教程之如何检测一段音频中是否有声音
  17. Linux解决僵尸进程的几种方式,SIGCHLD信号设置SIG_IGN处理方式等
  18. 安全计算:使用ClamWin为高级用户提供免费病毒防护
  19. flutter 解耦框架BLoC在网络请求中的应用
  20. 局域网计算机修改网络用户,windows10怎么修改局域网网络名称

热门文章

  1. java物流管理系统_基于java的物流管理系统
  2. 空间点集的三角剖分工具——四面体生成器(TetGen)和三维三角剖分包(CGAL)
  3. Origin2018给两条曲线间画阴影/使用数据标记功能/绘制分段函数/求分段函数的微分图
  4. 两条平行线之间的距离
  5. 为什么我朋友的移动手机打不开我的网站却能打开www.ip138.com?
  6. linux操作系统——linux删除个人账户密码
  7. 高盛发布区块链报告:从理论到实践(中文版)五
  8. shift键计算机功能,shift键功能有哪些 shift键有哪些功能【详解】
  9. Android微信授权登录闪退,如何解决微信闪退问题 四种解决微信闪退无法登录的原因及方...
  10. 【oracle数据库实验相关步骤和语句】