Python生成器

python之生成器 生成器 1.生成器 生成器(generator)也是一种迭代器,在每次迭代时返回一个值,直到抛出 StopIteration 异常。它有两种构造方式: (1).生成器表达式 和列表推导式的定义类似,生成器表达式使用 () 而不是 [] ,比如: 可以看出生成器表达式无法像列表推导式那样直接输出,它和可迭代对象一样只能采用for循环调用next()函数 (2).生成器函数 含有 yield 关键字的函数,调用该函数时会返回一个生成器。 可以看到,上面的函数没有使用 return 语句返 阅读详情

1.生成器概念

我们可以通过列表生成式创建一个列表,但是由于内存限制,列表的容量是有限的,不能占用太大的存储空间。如果我们只需要使用列表中前面几个元素,那么后面的大多数元素占用的空间都是浪费的。

因此,如果列表的元素可以按某种算法推算出来,那么我们就可以在循环的过程中推算出后续的元素,从而避免创建完整的list,并且节省了大量空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

生成器是一个特殊的程序,可以被用作控制循环迭代。它会使用yield返回函数的值,每次调用yield会暂停,而可以使用next()和send()函数恢复生成器。

生成器类似于返回值是数组的一个函数,这个函数可以接收参数,可以被调用。但是,一般函数会一次性返回包括了所有数值的数组,而生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前面的几个返回值。因此生成器看起来像一个函数,实际上它也是一种迭代器,但你只能对其迭代一次,它的值是在迭代时产生的。

2.生成器表达式

创建一个generator的方法有很多,其中比较简单的一种方法是,把一个列表生成式的[]换成(),就可以得到一个generator。如(x for x in range(3))就是一个生成式表达式,它会返回一个生成器对象,这个对象只有在需要的时候才产生结果。

# 列表生成式
l = [x * 2 for x in range(10)]
print(l)

# 生成器表达式
g = (x*2 for x in range(10))
print(g)

结果如下:

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
<generator object <genexpr> at 0x00000227FEC04A48>

可以看出,列表生成式得到的是一个列表,而生成器得到的是一个generator对象(可迭代对象)。

我们可以用for循环遍历generator对象获取里面的每一个值

g = (x*2 for x in range(3))
for i in g:
    print(i)

结果如下:

0
2
4

也可以用next()方法得到下一个返回值

g = (x*2 for x in range(3))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

结果如下:

0
2
4
Traceback (most recent call last):
  File "generator.py", line 10, in <module>
    print(next(g))
StopIteration

next()方法会不断取下一个值,直到没有找到元素为止,然后抛出StopIteration异常。

生成器表达式来源于迭代和列表解析的组合,生成器和列表解析类似。

生成器表达式对内存空间进行优化,它不需要像方括号的列表解析一样,一次构造出整个结果列表。它运行起来比列表解析式稍微慢些,适用于非常大的结果集合运算。

3.生成器函数

定义:一个用def定义的函数,利用关键字yield一次性返回一个结果。

一般函数在执行完毕后会返回一个值然后退出,但是生成器函数会自动挂起,然后等待继续执行。它利用yield关键字挂起函数,给调用者返回一个值,同时保留当前的状态,等待指令继续执行函数。

生成器和迭代器协议是密切相关的,迭代器都有一个__next__()成员方法,这个方法要么返回迭代下一项,要么抛出StopIteration异常结束迭代。

我们将上面的生成器表达式改造成生成器函数如下:

def get_even(n):
    for x in range(n):
        yield x * 2

g = get_even(3)
print(g)

得到g的值为<generator object get_even at 0x0000029E955B7648>,可以看出g是一个生成器对象。

用next()方法取生成器g的下一个值

print(next(g))
print(next(g))
print(next(g))
print(next(g))

结果如下:

0
2
4
Traceback (most recent call last):
  File "generator.py", line 10, in <module>
    print(next(g))
StopIteration

既然g是一个生成器,那么我们也可以用for循环来遍历

for i in get_even(3):
    print(i)

结果如下:

0
2
4

4.总结

  • 可迭代对象可以用for循环进行遍历,如果这个迭代对象是字符串、列表、文件等,那么遍历前数据都生成并存放在内存中,这样会非常耗内存。

  • 生成器是可迭代的,但只能迭代一次。

  • 生成器之所以可迭代是因为它含有__next__()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。

  • 带有yield的函数不再是一个普通的函数,而是一个生成器generator,可用于迭代。

  • yield是一个类似return的关键字,迭代一次遇到yield的时候就返回yield后面的值。而且下一次迭代的时候,从上一次迭代遇到的yield后面的代码开始执行。

  • 带有yield的函数不仅仅只是用于for循环,还可以用作某个函数的参数,只要这个函数的参数也允许迭代参数。

Python中的列表生成式(List Comprehensions)和列表生成器(Generator) Python中的列表生成式(List Comprehensions)和列表生成器(Generator),是Python提供的两个高级应用机制。生成式是一种简写机制,坚持了龟叔的“Python要简单优雅”的设计理念。生成器虽然翻译成中文以后只有一字之差,但是实现的机制和生成式已经完全不同了。它存储的是一个算法,而非具体数据。如何理解呢?听我娓娓道来。 阅读详情

相关推荐

【Python】列表生成器,请详细解释

你还可以在列表生成器中使用多重嵌套的循环结构。如果你希望生成大数据集而避免占用过多内存,可以使用生成器表达式代替列表生成器。生成器表达式会逐个计算元素而不是一次性加载到内存中,因此它在内存方面更加高效。循环生成列表和使用列表生成器是两种常见的方法,下面是它们的对比。通过列表生成器,你可以使用简单的语法在一行内生成新列表。计算每个数字的平方,最后把所有平方数存储到列表。你也可以在列表生成器中使用条件语句来筛选数据。作为条件语句,仅将偶数的平方添加到列表中。从上面可以看出,列表生成器通常比传统的。

wq6qeg88的博客 1351

Python入门:生成器&迭代器

通过列表生成式,可以直接创建一个列表,但是,受到内存限制,列表容量是有限的,而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数占用的空间都白白浪费了。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。你可能会想到2种方式。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

Trb401012的博客 1041

什么是python的生成器

【前言】 我们可以通过列表生成式直接创建一个列表,但是受内存限制,列表的容量肯定是有限的。而且如果创建一个包含1000万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大数元素占用的空间都白白浪费了。 所以,如果列表元素可以按照某种算法推算出来,那么我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的内存空间。在python中这种一边循环一边计算的机制,称为生成器(Generator)。 所以说生成器也是一种迭代器,但是你只能对

Be_Nice的博客 2661

学点简单的Python之Python生成器

学点简单的Python之Python生成器   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 若需联系博主,可以联系本人微信:qiguanjie2015 什么是生成器?生成器能够做什么 在Python中,使用了yield的函

一起加油 1万+

Python 中的生成器

生成器是按需运行的,因此不仅内存效率高 还提供了一种在需要时生成值的方法。生成器表达式可用于动态创建简单的生成器(也称为匿名函数),而无需编写特殊的方法。一直以来,把无限流数据放入内存都是一个挑站,这个问题可以用生成器很方便地解决,因为迭代器一次只加载一项数据。在 Python 中,生成器是一种生成迭代器的方便的方法,可以通过实现生成器函数实现的。生成器函数和普通函数类似,唯一的不同点是,生成器函数使用。生成器送入该生成器的质数的平方。相比之前的代码,这个用生成器生成迭代器的代码,简洁多了。

dowhileprogramming的专栏 1486

Python学习之 ---生成器+生成器函数

生成器★★★★ 知识导图 生成器generator ● 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 ● 生成器对象,是一个可迭代对象,是一个迭代器 ● 生成器对象,是延迟计算、惰性求值的 生成器函数 ●函数体中包含yield语句的函数,就是生成器函数,调用后返回生成器对象. 生成器函数 def inc(): ...

等风来的博客 3179

python 生成器

函数生成器 python函数中有yield关键字,函数就变成了生成器。 #!/usr/bin/env python3 #coding:utf8 def fun(): n=0 while True: n+=1 yield n g=fun() print(type(g)) print(next(g)) python3 g.py <class 'generator'> 1 案例 使用函数生成器打印斐波那契数列。 cat fib.py #!/usr/bin/

weixin_40548182的博客 5909

UOS忘记密码别慌!用LiveCD工具5分钟搞定,附命令行救援模式详细步骤

本文详细介绍了UOS系统密码遗忘时的两种解决方案:图形化LiveCD工具和命令行救援模式。针对普通用户,LiveCD工具提供5分钟快速重置密码的便捷操作;而技术人员可通过命令行深度解析系统分区挂载与密码修改流程。文章还包含安全加固建议,帮助用户预防类似问题发生。

weixin_27032989的博客 592

python生成器

生成器(generator)是一种返回一个值的迭代器,每次从该迭代器取下一个值。生成器表达式生成器函数生成器函数,通用生成器协程生成器委托生成器子生成器生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。它不需要迭代器的类一样写__iter__()和__next__()方法了,只需要一个yield关键字。当一个生成器函数被调用的时候,它返回一个迭代器,称为生成器或者生成器对象。生成器一定是迭代器(反之不成立),因此任何生成器也是以一种惰性加载的模式生成值。

acktomas的博客 1017

【GESP】C++四级考试大纲知识点梳理, (10) 文件读写和重定向

其实,由于本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。孩子放假,出游一周,没有更新。刚刚归来,继续学习。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。(10)掌握文件操作中的重定向,实现文件读写操作,了解文本文件的分类,掌握写操作、读操作、读写操作。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。孩子放假,出游一周,没有更新。

CoderCoding的博客 527

【UGUI】二、Text(TMP) 文本

Text(TMP)、导入中文字库

天行健,君子以自强不息 3369

【Python】生成器

生成器摘要 生成器是一种特殊的迭代器,通过yield关键字实现按需生成数据的特性。与普通函数不同,生成器函数可以暂停和恢复执行,保持中间状态,适用于大数据处理、无限序列等场景。创建方式包括生成器函数(含yield)和生成器表达式。关键特点包括: 惰性计算,节省内存 支持send()传值、throw()抛异常等交互操作 通过yield from实现生成器委托 遵循迭代器协议(__iter__和__next__方法) 典型应用包括流式数据处理、大文件读取和协程实现。

m0_72516377的博客 1270

机器学习-深嵌交叉验证(Nested Cross-Validation)

Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from...

Santorinisu Blogs 2718

python生成器有几种写法,python生成器的作用

迭代器和生成器以及上下文管理器都是python的高级特性,它们的区别在于实例化出来的对象中是否含有一些函数。在for循环中不管是传入的可迭代对象还是迭代器对象(生成器对象)都会先进行调用iter()方法将其变为迭代器,再进行执行next()方法,直到抛出异常。

K12345611717的博客 1038

Qt Installer Framework4.6.1的最基础使用1(win10+离线安装包 )

因工作需要,win程序发布后,打包成一可执行exe文件,且兼容win7系统笔者记录了一些关键要点,供有需要的小伙伴使用。

aggs1990的专栏 905

动量因子在A股市场的有效性分析:量化实证研究

验证动量因子在A股市场的有效性及时间周期性分析不同时间窗口(短期/中期/长期)对动量效应的影响量化交易成本、市场流动性对动量策略收益的侵蚀程度比较A股与成熟市场(如美股)动量效应的差异特征理论框架:行为金融学解释动量效应的产生机制技术实现:Python全流程代码实现动量因子计算与回测实证分析:统计检验、风险收益指标、敏感性分析应用拓展:结合市场微观结构的策略优化方案动量因子(Momentum Factor)

2501_92132293的博客 2494

Python 生成器

概述 生成器是一个相对较新的Python概念,它是一种使用普通函数语法定义的迭代器。生成器和迭代器可能是今年来引入的最强大的功能,并且生成器是一个相当复杂的概念,要了解其工作原理需要花点时间。生成器能够让你编写出非常优雅的代码。 创建生成器 生成器创建和普通函数一样简单,下面通过一个简单的示例来说明生成器的用法: 创建一个将嵌套列表展开的函数,列表如下: nested = [[1,2,3],[3]...

luoyayun361的专栏 851

【数字IC基础】DFT(Design For Test)可测性设计

【数字IC基础】DFT(Design For Test)可测性设计

努力,加油每一天鸭~ 3467

python 中的生成器

在 Python 中,生成器(Generator)是一种特殊类型的迭代器,允许你在迭代过程中逐步生成值,而不是一次性生成所有值。生成器的创建通常通过包含 `yield` 关键字的函数实现。当函数包含 `yield` 时,该函数会返回一个生成器对象。生成器的主要优点包括: 1. **延迟求值(Lazy Evaluation)**:生成器在需要值的时候才生成值,这样可以节省内存。 2. **流式处理(Stream Processing)**:适用于处理大型数据集或无限序列,因为它们不会将所有值一次性加载到内存中

一个8年大数据开发工程师的碎碎念 1972

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python中生成器

一.为什么要有生成器 秉着先问为什么,再问怎么做的原则,我们来看看为什么python会添加生成器这个功能。 python在数据科学领域可以说是很火。我想有一部分的功劳就是它的生成器了吧。 我们知道我们可以用列表储存数据,可是当我们的数据特别大的时候建立一个列表的储存数据就会很占内存的。这时生成器就派上用场了。它可以说是一个不怎么占计算机资源的一种方法。 二.简单的生成器 我们可以用列表推导(生成式)来初始化一个列表: list = [x*2 for x in range(10)] print(list)

仁化居之安 1905

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python3生成器_Python3 生成器

Python3 生成器阅读 (125) |发布于 2020-05-19 14:29:25在Python中,一边循环一边计算出元素的机制,称为生成器:generator。生成器的优点:一次返回一个结果,延迟计算。这对于大数据量处理,是个非常有用的优势。占用内存量是工程师必须考虑的一个问题。提高代码可读性。使用生成器,代码行数更少。生成器有两种表示形式:生成器函数:外表看上去像是一个函数,但是没有用r...

weixin_39760919的博客 172
上一篇: Python十道基础编程题
下一篇: 推荐一个好用的PyCharm文本格式
Python热爱者
博客等级 码龄7年 3059粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值