学点简单的Python之Python生成器

384 篇文章 17 订阅
368 篇文章 15 订阅
本文介绍了Python中的生成器,详细解释了如何创建和使用生成器,包括next()和send()函数的运用。生成器通过yield语句在内存中生成值,避免了大列表导致的内存问题。文章通过斐波那契数列的例子展示了生成器的灵活性,并演示了使用next()和send()获取生成器值的方法。
摘要由CSDN通过智能技术生成

什么是生成器?生成器能够做什么

在Python中,使用了yield的函数被称为生成器,生成器返回的是一个迭代器的函数,只能用于迭代操作,在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

生成器常用场景:例如我们需要生成一个有规律向前推进的列表,或者一个1-1亿的列表等等,当我们列表中元素数量十分大时,内存会爆栈。但是如何我们元素间是有规律的,则我们可以利用生成器来解决这个问题。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

注意这里使用的是()而不是列表的[]。如果使用列表,内存将会爆栈,程序直接卡死,各位小伙伴有兴趣的话可以自己尝试一下哦!

如何创建一个生成器?如何使用生成器?

那生成器只能生成这样连续的简单数列吗?当然不是!我们可以编写自己的生成器函数,例如我们编写一个斐波那契数列的生成器。

图片.png

输出为:

学点简单的Python之Python生成器

这里我们每次返回一个fibonacci数列的值,每次返回的值即通过yield返回的值,返回之后生成器中的状态保持不变,等待下一次调用,当下一次调用来时,继续运行直到通过yield返回下一个值,以此循环。生成器不是将所有数保存在数列中,而是一个迭代器,每次返回时向前迭代。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

next()和send()函数

我们可以利用next( )函数来获取迭代器的下一个值,例如下面这个例子:

学点简单的Python之Python生成器

输出结果为:

图片.png

生成器即是迭代器也是可迭代对象,即我们可以通过next来依次获取迭代器中的值,同时也可以通过之前例子中的迭代器直接获取。

当前例子中我们迭代器中只有四个值,那么当我们获取四个值之后再次调用next(a)时,便会抛出StopIteration异常,即当前迭代器没法继续向前迭代。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

同时,我们也可以使用send()函数来获取下一个值,但是与next()函数不同的是,send()函数需要一个参数,将这个参数发送到yield表达式的值。例如下面这个例子:

图片.png

这时我们的输出为:

图片.png

这里与我们上面例子不同的是,我们每次yield返回后,将这个yield 1的值作为表达式赋值给temp,当我们直接使用next()获取时,这个表达式的值为None,同时我们发现只输出了三个None,这也验证了我们之前说的,每次调用下一个值后,我们会停留在yield的位置,保存所有状态,直到下一次调用才会继续向下走。最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

我们通过send()函数来获取下一个值时,我们在send()函数中传的参数将会作为yield 1表达式的值赋值给temp,例如下面的例子。

图片.png

输出为:

学点简单的Python之Python生成器

如果我们要使用send()来调用下一个值但我们不需要发送消息时,我们可以传递一个None进去,即a.send(None) 好了,今天的学点简单的Python之Python生成器篇就到这里了,我们下次再见!如果这篇文章对您有帮助的话,可以点赞关注博主一下,给博主一些鼓励,哈哈~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值