Python编程:如何搞定生成器(Generator)及表达式?来盘它!Python教程

在前面的篇章中,我们学习了迭代器,这是一个很好的工具,特别是当你需要处理大型数据集时。然而,在Python中构建自己的迭代器有点麻烦和耗时。你必须定义一个实现迭代器协议(__iter__()和__next__()方法)的新类。在这个类中,需要自己管理变量的内部状态并更新它们。此外,当__next__()方法中没有要返回的值时,需要抛出StopIteration异常。

有没有更好的实现方式呢?答案是肯定的!这就是Python的生成器(Generator)解决方案。下面就来盘盘它。

接下来,我们更进一步,轻松学懂Python中生成器是如何工作的以及如何定义它们。

如前一节所述,生成器是Python中一种特殊类型的函数。此函数不返回单个值,而是返回一个迭代器对象。在生成器函数中,返回值使用yield语句而不是return语句。下面定义一个简单的生成器函数,代码清单如下:

代码清单片段-01

在上述清单中,我们定义一个生成器函数。该函数执行yield语句而不是return关键字。yield语句使这个函数成为生成器。当我们调用这个函数时,它将返回(产生)一个迭代器对象。我们再来看看生成器的调用:

代码清单片段-02

调用生成器,通常就跟创建对象类似,调用生成器函数,并赋给变量。

运行程序输出结果如下:

根据规则,此生成器函数不应该包含return关键字。因为如果它包含,那么return语句将终止此函数,也就无从满足迭代器的要求了。

现在,让我们通过for循环的帮助来定义一个更具有实际意义的生成器。在本例中,我们将定义一个生成器,它将连续跟踪生成从0开始的数字序列,直到给定的最大限制。

代码清单如下:

代码清单片段-03

运行程序输出结果类似如下:

有一点需要注意,在定义生成器时,返回值必须是yield语句,并不是说生成器不能出现return语句。只是通常把返回非None值return语句放在生成器最后,为StopIteration异常添加附加信息,以便调用者处理。示例如下:

代码清单片段-04

下面是未进行异常处理时运行程序输出结果类似如下:

如果一个函数至少包含一个yield语句,那么它就是生成器函数。如果需要,还可以包含其他yield或return语句。yield和return关键字都将从函数中返回一些东西。

return和yield关键字之间的差异对于生成器来说非常重要。return语句会完全终止函数,而yield语句会暂停函数,保存它的所有状态,然后在后续的调用中继续执行。

我们调用生成器函数的方式和调用普通函数一样。但在执行过程中,生成器在遇到yield关键字时暂停。它将迭代器流的当前值发送到调用环境,并等待下一次调用。同时,它在内部保存局部变量及其状态。

以下是生成器函数与普通函数不同的关键点:

我们用一个简单的例子来演示普通函数和生成器函数之间的区别。在这个例子中,我们要计算前n个正整数的和。为此,我们将定义一个函数,该函数给出前n个正数的列表。我们将以两种方式实现这个函数,一个普通函数和一个生成器函数。

普通函数代码如下:

代码清单片段-05

现在让我们为相同的操作定义一个生成器函数来实现,代码清单如下:

代码清单片段-06

运行程序结果类似如下:

性能改进的主要原因(当我们使用生成器时)是值的惰性生成。这种按需值生成的方式,会降低内存使用量。生成器的另一个优点是,你不需要等到所有元素都生成后才开始使用它们。

有时候,我们需要简单的生成器来执行代码中相对简单的任务。这正是生成器表达式(GeneratorExpression)用武之地。可以使用生成器表达式轻松地动态创建简单的生成器。

生成器表达式类似于Python中的lambda函数。但要记住,lambda是匿名函数,它允许我们动态地创建单行函数。就像lambda函数一样,生成器表达式创建的是匿名生成器函数。

生成器表达式的语法看起来像一个列表推导式。不同之处在于,我们在生成器表达式中使用圆括号而不是方括号。请看示例:

运行结果类似如下:

运行程序,遍历出的元素项结果是否和列表推导式一样。

我们再看一个例子。来定义一个生成器,将字符串中的字母转换为大写字母。然后调用next()方法打印前两个字母。代码示例如下:

运行输出结果如下:

1)内存效率:

2)延迟计算:

生成器提供了延迟(惰性)计算求值的功能。延迟计算是在真正需要值时计算值,而不是在实例化时计算值。假设你有一个大数据集要计算,延迟计算允许你在整个数据集仍在计算生成中可立即开始使用数据。因为如果使用生成器,则不需要整个数据集。

3)易实现和可读性:

生成器非常容易实现,并且提供了好的代码可读性。记住,如果你使用生成器,你不需要担心__iter__()和__next__()方法。你所需要的只是函数中一个简单的yield语句。

4)处理无限流:

当你需要表示无限的数据流时,生成器是非常棒的工具。例如,一个无限计数器。理论上,你不能在内存中存储无限流的,因为你无法确定存储无限流需要多少的内存大小。这是生成器真正发挥作用的地方,因为它一次只产生一项,它可以表示无限的数据流。它不需要将所有的数据流存储在内存中。

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

THE END
1.python代码自动生成器野牛程序员代码自动生成器可以根据用户提供的规则或模板自动生成特定编程语言的代码。这种工具通常用于提高开发效率,减少手动编写重复代码的工作量。以下是一个简单的Python代码自动生成器的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 http://yncoders.com/show/6389
2.在线python转跳代码生成器在线python转跳代码生成器,生成python跳转代码,输入网址,可以使用301或者302的方式生成python跳转代码https://www.bejson.com/transfor/location_create_python/
3.4个免费代码自动生成神器日常写代码,是一件非常需要耐心的事情,尤其是那些没有技术含量重复使用到的一些代码排列组合,比如前端的一些html和css布局,简单繁杂,这个时候就会使用到一些免费代码自动生成神器,让我们提高效率。 1:在线搭建框架-懒猴子CG 官方网址:http://cg.lazy-monkey.com/ ...https://www.jianshu.com/p/76d05a51567e
4....Compose部署,缓存,业务代码生成器,接口限流,DjangoAdmin验证码...python manage.py seed app_label 10 其中app_label 是开发者自行创建的 App 名称,比如 DjangoStarter 中的示例应用 demo 使用代码生成器(可选) DjangoStarter 内置业务代码生成器,开发者只需要专注于编写最核心的models.py完成模型定义,其他代码自动生成,减少重复劳动,解放生产力。 https://gitee.com/deali/DjangoStarter
1.Python:生成器forlinf: yieldl.strip()# 返回数据时,去除行尾的换行符号 forlinread_file('hello.txt'): print(l) 6. 总结 生成器是 Python 中强大且灵活的工具,能够有效处理迭代和大型数据集。通过使用生成器,您可以获得更高效的内存使用和更自然的代码结构。https://blog.csdn.net/Wei_sx/article/details/144073095
2.python实现自动生成C++代码的代码生成器python这篇文章介绍了python实现C++代码生成器的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错;而借用python的代码自动生成,可以...https://www.jb51.net/article/255113.htm
3.python万能代码生成器mob649e8157aaee的技术博客在现代软件开发中,代码生成器的出现极大地提升了开发效率。随着Python语言的广泛应用,许多开发者开始探索如何构建自动化的代码生成器,帮助简化重复的编码任务。本文将为大家介绍Python万能代码生成器的概念,并提供基本的代码示例。此外,我们也将探讨其在开发中的实际应用,最后以一个简单的ER图总结。 https://blog.51cto.com/u_16175447/11965233
4.什么是Python的迭代器和生成器?(附代码)(附代码) 本文介绍了Python中的生成器和迭代器。在处理大量数据时,计算机内存可能不足,我们可以通过生成器和迭代器来解决该问题。 迭代器:一次一个! Python 是一种美丽的编程语言。我喜欢它提供的灵活性和难以置信的功能。我喜欢深入研究Python的各种细微差别,并了解它如何应对不同的情况。https://ioda.lntu.edu.cn/info/1147/1561.htm
5.使用VisualPython自动生成代码腾讯云开发者社区使用Visual Python自动生成代码 Visual Python简介 VisualPython是一个Python 代码生成器,只需要鼠标点击就可以实现导入包、读入文件、可视化等常用功能。 #不需要再看着matplotlib文档,写一段画图代码了:) 官网:https://www.visualpython.ai/ (鼠标点击设置参数,生成代码)...https://cloud.tencent.com/developer/article/2187228
6.自创的安卓代码生成器生成iclauncher图片自创的安卓代码生成器-生成ic_launcher图片 技术标签: 框架介绍 java android大家好,我是飞刀,这次我来讲一下生成ic_launcher的功能。 首先打开界面看一下: 界面上有个mipmap和drawable的选择项,有个选择图片的按钮,有个自定义图片大小的输入框。 这里选择了个星星的图片,点击生成,图片所在的文件夹下生成了一个...https://www.pianshen.com/article/94351636958/
7.同步轮G代码自动生成器行业同步轮G代码自动生成器 行业 - 制造Th**er 上传26KB 文件格式 rar 同步轮 同步轮G代码自动生成器(齿数小于20个免费版) 点赞(0) 踩踩(0) 反馈 所需:1 积分 电信网络下载 客户、银行、ERP三方沟通文档.doc 2024-11-20 17:09:28 积分:1 https://www.coder100.com/index/index/content/id/2376630