热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PythonListComprehensionsvsGeneratorExpressions

本文是译文,原文:https:www.geeksforgeeks.orgpython-list-comprehensions-vs-generator-expressions列表推

本文是译文,原文:

https://www.geeksforgeeks.org/python-list-comprehensions-vs-generator-expressions/


列表推导式与生成器表达式

什么是列表推导式

列表推导式是一种定义和创建列表的优雅方式。它让我们以更少的代码、使用for循环创建列表。使用列表推导式只需要一行代码,否则的话,一般需要3到4行代码。

例子(不使用列表推导式):

# initializing the list
list = []

for i in range(11):
if i % 2 == 0:
list.append(i)

# print elements
print(list)

  输出

0 2 4 6 8 10

  现在让我们使用列表推导式:

list = [i for i in range(11) if i % 2 == 0]
print(list)

  输出

0 2 4 6 8 10

  


什么是生成器表达式

生成器表达式在某种程度上与列表推导式有类似地方,但是生成器表达式并不构建列表对象。与(列表推导式)创建一个列表并将整个序列存储在内存中不同,生成器只会在需要的时候,生成下一个元素。

对于一个有return语句的一般函数,当它被调用的时候,当执行到return语句时,就结束了。但是一个有yield语句的函数,会保存函数的状态,当下次调用的时候,它会从这个保存的状态继续执行。

生成器表达式允许我们在不使用yield关键字的情况下创建一个生成器。

语法区别:生成器表达式使用圆括号,而不像列表推导式使用方括号。

列表推导式:

# List Comprehension
list_comprehension = [i for i in range(11) if i % 2 == 0]

print(list_comprehension)

  输出

0 2 4 6 8 10

  生成器表达式:

# Generator Expression
generator_expression = (i for i in range(11) if i % 2 == 0)

print(generator_expression)

  输出


  在上面的例子中,如果我们想打印生成器表达式的结果,我们可以遍历这个生成器表达式对象:

for i in generator_expression:
print(i, end=" ")

  输出

0 2 4 6 8 10

  


列表推导式与生成器表达式区别

 生成器表达式只会在每次调用的时候,生成一个元素。相反,列表推导式需要存储所有元素。这样我们可以说,生成器表达式比列表更节约内存。

让我们看下下面的例子。

# import getsizeof from sys module
from sys import getsizeof

comp = [i for i in range(10000)]
gen = (i for i in range(10000))

#gives size for list comprehension
x = getsizeof(comp)
print("x = ", x)

#gives size for generator expression
y = getsizeof(gen)
print("y = ", y)

  输出

x = 87624
y = 88

  我们看到生成器表达式可以节约内存。那么执行效率上哪?我们看下下一个例子。

#List Comprehension:
import timeit

print(timeit.timeit('''list_com = [i for i in range(100) if i % 2 == 0]''', number=1000000))

  输出

8.118047142050102

  

#Generator Expression:
import timeit

print(timeit.timeit('''gen_exp = (i for i in range(100) if i % 2 == 0)''', number=1000000))

  输出

0.7548244756850693

  在执行时间上二者差别显著。可见,生成器表达式更快,更高效。



推荐阅读
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
author-avatar
他的一个号码_616
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有