首先,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
结束了!
欢迎关注我的技术公众号
领取专属 10元无门槛券
私享最新 技术干货