文章目录
🌉一、生成器的概念
我们知道的迭代器有两种:一种是调用方法直接返回的,比如for循环就是Python自带的迭代器,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省内存。避免将大量数据一次性取出而导致的错误和内存不足问题。如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。
简而言之:生成器就是我们自己写的迭代器
🌉二、生成器函数的定义
🎇1、yield和return关键字的区别和相同点
yield是用于生成器。什么是生成器,你可以通俗的认为,在一个函数中,使用了yield来代替return的位置的函数,就是生成器。
✨(1)yield和return关键字的的不同点:
它不同于函数的使用方法是:函数使用return来进行返回值,每调用一次,返回一个新加工好的数据返回给你;yield不同,它会在调用生成器的时候,把数据生成object,然后当你需要用的时候,要用next()方法来取,同时不可逆。你可以通俗的叫它"轮转容器",可用现实的一种实物来理解:水车,先yield来装入数据、产出generator object(你执行了含有yield关键字的函数,之后调用该函数不会的到返回值而是得到一个可迭代的对象"generator object" )使用next()来释放;
好比水车转动后,车轮上的水槽装入水,随着轮子转动,被转到下面的水槽就能将水送入水道中流入田里。水车这个比方太恰当不过了,就是每次有个数据要取出来,先按照顺序将数据放进水车的水槽中,当后面在调用next函数的时候相当于使用水槽的水,并且是按照水车中原来进去的顺序进行取水的(先进先出) ‘
✨(2)yield和return关键字的的相同点:
相同点:都是返回函数执行的结果\
不同点:return 在返回结果后结束函数的运行,而yield 则是让函数变成一个生成器(或者叫做可迭代对象),生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值用一个栗子总结:
def f1(): return 'aaa' return 'bbb' def f2(): yield 'aaa' yield 'bbb' print(f1()) print(f2()) for i in f2(): print(i) 输出结果: aaa <generator object f2 at 0x000001731AFFFC10> aaa bbb
🎇2、生成器函数初识
✨(1)什么是生成器函数
一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
简而言之就是函数内部含有yield关键字的就是生成器函数
✨(2)生成器函数的好处
生成器有什么好处就是不会一下子在内存中生成太多数据,而是你找它要它才给你值,你不向它要它也不会返回值给你。
举个栗子:\
假如我预定了2000000件秋装服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以一批一批的找工厂拿。而不能是一说要生产2000000件衣服,工厂一次性生产2000000件衣服在一起给我,等回来做好了,都冬天了。。。def produce(): """生产衣服""" for i in range(2000000): yield "生产了第%s件衣服"%i product_g = produce() print(product_g.__next__()) #要一件衣服 print(product_g.__next__()) #再要一件衣服 print(product_g.__next__()) #再要一件衣服 num = 0 for i in product_g: #要一批衣服,比如5件 print(i) num +=1 if num == 5: break #到这里我们找工厂拿了8件衣服,我一共让我的生产函数(也就是produce生成器函数)生产2000000件衣服。 #剩下的还有很多衣服,我们可以一直拿,也可以放着等想拿的时候再拿