当前位置: 首页 > 编程笔记 >

python生成器表达式和列表解析

鱼安然
2023-03-14
本文向大家介绍python生成器表达式和列表解析,包括了python生成器表达式和列表解析的使用技巧和注意事项,需要的朋友参考一下

绝大多数情况下,遍历一个集合都是为了对元素应用某个动作或是进行筛选。如果看过本文的第二部分,你应该还记得有内建函数map和filter提供了这些功能,但Python仍然为这些操作提供了语言级的支持。

(x+1 for x in lst) #生成器表达式,返回迭代器。外部的括号可在用于参数时省略。 
[x+1 for x in lst] #列表解析,返回list

如你所见,生成器表达式和列表解析(注:这里的翻译有很多种,比如列表展开、列表推导等等,指的是同一个意思)的区别很小,所以人们提到这个特性时,简单起见往往只描述成列表解析。然而由于返回迭代器时,并不是在一开始就计算所有的元素,这样能得到更多的灵活性并且可以避开很多不必要的计算,所以除非你明确希望返回列表,否则应该始终使用生成器表达式。接下来的文字里我就不区分这两种形式了:)

你也可以为列表解析提供if子句进行筛选:

(x+1 for x in lst if x!=0)

或者提供多条for子句进行嵌套循环,嵌套次序就是for子句的顺序:

((x, y) for x in range(3) for y in range(x))

列表解析就是鲜明的Pythonic。我常遇到两个使用列表解析的问题,本应归属于最佳实践,但这两个问题非常典型,所以不妨在这里提一下:

第一个问题是,因为对元素应用的动作太复杂,不能用一个表达式写出来,所以不使用列表解析。这是典型的思想没有转变的例子,如果我们将动作封装成函数,那不就是一个表达式了么?

第二个问题是,因为if子句里的条件需要计算,同时结果也需要进行同样的计算,不希望计算两遍,就像这样:

(x.doSomething() for x in lst if x.doSomething()>0)

这样写确实很糟糕,但组合一下列表解析即可解决:

(x for x in (y.doSomething() for y in lst) if x>0)

内部的列表解析变量其实也可以用x,但为清晰起见我们改成了y。或者更清楚的,可以写成两个表达式:

tmp = (x.doSomething() for x in lst)
(x for x in tmp if x > 0)

列表解析可以替代绝大多数需要用到map和filter的场合,可能正因为此,著名的静态检查工具pylint将map和filter的使用列为了警告。

 类似资料:
  • 问题内容: 什么时候应该使用生成器表达式,什么时候应该在中使用列表推导? 问题答案: John的答案很好(当你要迭代多次时,列表理解会更好)。但是,还应注意,如果要使用任何列表方法,都应使用列表。例如,以下代码将不起作用: 基本上,如果你要做的只是迭代一次,则使用生成器表达式。如果你要存储和使用生成的结果,那么列表理解可能会更好。 由于性能是选择彼此的最常见原因,所以我的建议是不要担心它,而只选择

  • 本文向大家介绍详解python列表生成式和列表生成式器区别,包括了详解python列表生成式和列表生成式器区别的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python(列表生成式/器)的具体代码,供大家参考,具体内容如下 一、列表生成式 二、小例子 三、字典生成式 四、列表生成器和列表生成式的区别 列表生成式: 会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多

  • 本文向大家介绍python 中的列表生成式、生成器表达式、模块导入,包括了python 中的列表生成式、生成器表达式、模块导入的使用技巧和注意事项,需要的朋友参考一下 5.16 列表生成式 5.17 列表生成式与生成器表达式的应用 第六章模块 什么是模块? 模块就是一系统功能的集合体,在python中,一个py文件就是一个模块,比如module.py,其中模块名module 6.1 import

  • 本文向大家介绍python列表生成式与列表生成器的使用,包括了python列表生成式与列表生成器的使用的使用技巧和注意事项,需要的朋友参考一下 列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况 列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如

  • 问题内容: 在Python中,通过 生成器表达式 创建生成器对象与使用 yield 语句之间有什么区别吗? 使用 yield : 使用 生成器表达式 : 这两个函数都返回生成器对象,这些对象生成元组,例如(0,0),(0,1)等。 一个或另一个有什么优势吗?有什么想法吗? 谢谢大家!这些答案中有很多不错的信息和进一步的参考! 问题答案: 两者之间只有细微的差别。您可以使用该模块自己检查这种事情。

  • Quartz 的Cron任务调度表达式一般人很难理解,在Googole上查询也没有发现类似的代码,所以开发了一个对Quartz Cron 表达式的可视化双向解析和生成的一个java的GUI程序,供使用Quartz的程序员参考和使用,源代码放在SourceForge网站