一、迭代器
1、可迭代协议
查看类中定义好的所有方法:dir 函数
print(dir('qwe')) 打印对象中的方法和函数 print(dir(str)) 打印类中声明的方法和函数
2、内部含有__iter__方法的对象就叫做可迭代对象,可迭代对象遵循可迭代协议。
可迭代对象不能取值,因为内部不含有__next__方法
3、如何判断是否为可迭代对象。 print( '__iter__' in dir( ) )
二、生成器
1、生成器的实质就是迭代器
在python中有三种方式来获取生成器:
1、通过生成器函数
2、通过各种推导式来实现生成器
3、通过数据的转换获取生成器
def func(): print(111) return 222 ret = func() #函数调用 print(ret) 结果: 111 222
将函数中的return换成yield就是生成器
def func(): print(111) yield 222 ret = func() #获取生成器 print(ret) 结果:<generator object func at 0x00000000025E7308>
现在执行函数的时候就不是函数的执行了,而是获取一个生成器。
def func(): print(111) yield 222 ret = func() print(ret.__next__()) __next__()执行生成器 结果: 111 222
yield 和return 区别
1. 如果函数中包含了yield, 这个函数是一个生成器函数. 执行函数的时候是: 获取生成器
2. 生成器执行__next__(). 执行到下一个yield
3. yield的作用和return基本相同. 但是,只负责返回. 不会结束函数
4. return,结束函数.
当程序运行完最后一个yield,后面继续运行__next__()会报错
2、send 和__next__() 的区别
1、send 和__next__() 都是让生成器向下走一次
2、send可以给上一个yield位置传递值,不能给最后一个yield位置传递值,第一次执行生成器代码不能使用send()
def jiaoyou(): print("开始旅游") address1 = yield "告诉我你想去哪里" print("去"+str(address1)) address2 = yield "你还想去哪儿?" print("还想去"+ str(address2)) yield "结束旅行" gen = jiaoyou() #获取生成器 ret = gen.__next__() # 执行到第一个yield 获取到返回值 print("ret=", ret) ret2 = gen.send("少林寺") #给address1传递‘少林寺’ print("ret2 = ", ret2) ret3 = gen.send("武当山") #给address2传递‘武当山’ print("ret3 = ", ret3) 结果: 开始旅游 ret= 告诉我你想去哪里 去少林寺 ret2 = 你还想去哪儿? 还想去武当山 ret3 = 结束旅行