首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通俗易懂解释Python的yield

首先,Python的yield的作用是什么? 运用什么场景?

接下来我们带着问题去学习yield吧。

一、可迭代对象

为了了解的yield作用,我们要先了解什么是生成器,在了解生成器之前,先提一下可迭代对象,迭代大家应该都知道,当建立一个列表,可以逐个读取列表,就叫做可迭代对象。如下:

mylist=[x*xforxinrange(3)]

foriinmylist:

print(i)

可迭代对象也就是上面的mylist有个特点,它会把初始化的所有值都存储在内存,所以你想读多少次就读多少次,不过有个坏处就是当数据很大时,就产生性能问题。

二、生成器

要想上面mylist普通迭代对象改为生成器,只要把[ ] 改为(),如下:

mygenerator=(x*xforxinrange(3))

foriinmygenerator:

printi

生成器是迭代方式有点特别,只能读一次,不会把所有值存储在内存,就是实时生成数据。所以无论在后面加上多少个迭代读取,除了第一次,其他都没有值

foriinmygenerator:

printi

三、yield

终于要讲yield了,yield总会用在函数里面,功能类似return,不过他返回的是生成器,生成器不会一次返回所有结果,只是每次遇到yield关键字才会返回相应的结果,并保留当前状态,以便下一次的调用,如下面的例子:

def func():

for iinxrange(5):

yieldi

num = func()

foriinnum:

printi

因为func()有关键字yield,所以先返回生成器赋给num,在下面的迭代读取,每要读取一个值,生成器就返回那个值,要读取 0 ? ,那yield就返回 0 ,然后就读取0,整个过程是这样的

('yield:', 0)

('want:', 0)

('yield:', 1)

('want:', 1)

('yield:', 2)

('want:', 2)

('yield:', 3)

('want:', 3)

('yield:', 4)

('want:', 4)

实现了实时生成数据,如果没有使用yield,那就结果是

('no:', 0)

('no:', 1)

('no:', 2)

('no:', 3)

('no:', 4)

('want:', 0)

('want:', 1)

('want:', 2)

('want:', 3)

('want:', 4)

可以看出一次生成所有值,然后存储内存,再一次性读取出来

四、应用

最近的的例子,生成无限序列

如果没有使用yield ,生成一个满足要求很大的列表,都存储在内存,内存不够就gg了

def get_primes(start):

forelementinmagical_infinite_range(start):

ifis_prime(element):

returnelement

如果使用生成器就不需要返回整个列表,每次都只是返回一个数据,避免了内存的限制问题。

defget_primes(number):

whileTrue:

ifis_prime(number):

yieldnumber

number+=1

结束了!

欢迎关注我的技术公众号

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180415G0LW3S00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券