测开之数据类型· 第4篇《迭代器、生成器》 (2)

li1 = iter(li)这个是可迭代对象。然后通过iter()转换成一个迭代器。

3.生成器比迭代器多了 3 种方法 send()方法 发送数据
close() 方法   关闭生成器  
throw() 方法   使用的 throw 指令抛出错误  

生成器是有send这个方法的,迭代器是没有的。

例如,前面有个生成器叫做tu:

# () 生成器表达式 tu = (i for i in range(1000))#生成器对象 print(tu)

tu可以调用send()这个方法,可以与生成器进行交互,可将数据传输到生成器里面。

4.为什么生成器有的方法,迭代器没有?

举个栗子:

生成器是迭代器的一种。

例如定义了一个父类,再有个子类,父类创建出一个对象,子类创建出一个对象。子类有自己的方法。父类创建的出来的对象里面,肯定没有子类对象里面的方法。 子类里面有的方法,父类里面没有。

迭代器就是“父类”。生成器就是“子类”。

def gen(): for i in range(1,5): yield i gen()

生成器运行的时候,调用函数gen(),调用这个函数的时候,这个函数里面的代码不会直接运行。

测开之数据类型· 第4篇《迭代器、生成器》

代码修改成这样:

def gen(): for i in range(1,5): yield i g = gen() print(g)

测开之数据类型· 第4篇《迭代器、生成器》

只有通过next()方法往生成器里面取值的时候,它才会从代码上面往下面运行。

这个send()方法可将数据传到生成器里面。使用next(),从生成器里面获取出一个值。如果使用send()方法,它也能够获取出来一条数据。

def gen(): for i in range(1,5): se = yield i print(se) g = gen() print(next(g)) print(g.send(100))

send()方法可以往生成器里面传入一个值。

测开之数据类型· 第4篇《迭代器、生成器》

通过send()方法生成数据的时候,它也可以往里面发送一个 100 的值。

5.数据发送到生成器,在哪个地方呢?

测开之数据类型· 第4篇《迭代器、生成器》

如果通过next()去取值的话,这个yield完毕后是没有返回内容的。

测开之数据类型· 第4篇《迭代器、生成器》

测开之数据类型· 第4篇《迭代器、生成器》

代码详解:

第一轮: 循环进来,通过next()去取值生成了一个 1:

def gen(): for i in range(1,5): se = yield i print(se) g = gen() print(next(g))

测开之数据类型· 第4篇《迭代器、生成器》

第二轮: 通过print(g.send(100))去发送值,然后打印:

def gen(): for i in range(1,5): se = yield i print('se的值:',se) g = gen() print(next(g)) print(g.send(100))

测开之数据类型· 第4篇《迭代器、生成器》

在第一轮结束之后,在yield这里,yield完毕就停止了。在第一轮yield完之后,第二轮通过send()传值进去,传到se那里,打印出来 100。

然后再往上返回一个数据,又暂停,返回第二条数据就是个 2。

第三轮: 通过next()再去生成一条元素,又触发了yield i这个地方,这里释放了,往后面走,往后面走的话,但是没有放数据进来,这个时候se是空的,打印出来的se是空的。

然后再往上,生成一条元素到 3,然后又停在yield i这个地方了,生成完元素,把这个值返回出去。

def gen(): for i in range(1,5): se = yield i print('se的值:',se) g = gen() print(next(g)) print(g.send(100)) print(next(g))

测开之数据类型· 第4篇《迭代器、生成器》

再次next()或者send()来触发它的时候,它会这样走:

测开之数据类型· 第4篇《迭代器、生成器》

注意: yield接收不是存在i中,这个yield返回出来的i是遍历出来的内容。

send()发进去的,是yield i这里运行完毕之后,当下一个send()触发的时候,它把这个值发送到yield i这里运行完毕之后的一个结果。

yield i这里把这个i返回出去,就停在这里不动了。send()发送个数据进去,那么数据就发送到个yield i这地方。

相当于yield i这个地方返回的一个结果,也就是send()发进去的内容,如果send()不发进去内容,返回出来是个空的。

温馨提示:生成器<迭代器<可迭代对象

三、系列推荐

测开入门篇《环境管理、编码规范、项目结构》

数据类型· 第 1 篇《元组和列表的性能分析、命名元组》

数据类型第 2 篇「字典和集合的原理和应用」

测开之数据类型· 第 3 篇《列表推导式、字典推导式、2 种方式创建生成器》

《Web 自动化》基础知识脑图

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyypjw.html