迭代器和生成器
可迭代对象
可迭代对象:有__iter__()方法的对象,调用该方法返回迭代器对象
例如:str、list、tuple、dict、set、range()、file、迭代器对象、enumerate、生成器
迭代器对象
可迭代对象通过__iter__()方法得到迭代器对象,例如:
[].__iter__()
{}.__iter__()
().__iter__()
迭代器对象:有__next__()方法的对象,也就是用该方法一次从迭代器对象中获得一个值,取出一个少一个
例如:file、enumerate()、生成器
优缺点:迭代器取值可以不依赖索引完成取值,但是不能计算长度,也不能指定位置取值(只能从前往后逐一取值)
重点:
①从迭代器对象中取值,取一个少一个,如果要从又开始取,,需要重新获得拥有所有元素的迭代器对象
②迭代器对象也有__iter__()方法,调用后等得到的是自己本身(当前含义几个元素,得到的就只有几个元素的迭代器对象)
for循环迭代
1.自动获取别迭代对象的迭代器对象
2.在内部一次一次调用__next__()方法取值
3.自动完成异常处理,例子如下
iter_obj=[1,2,3].__iter__()
while True:
try: #如果有异常操作,接收
ele = iter_obj.__next__()
print(ele)
except StopIteration: #StopIteration为错误类型,当报错时,执行下面代码块
# print("取完了")
break
4.for取值例子如下
for ele in st1: # 1.自动完成 for ele in st1.__iter__(): 2.自动完成异常处理
print(ele)
生成器
生成器:包含有yield关键字的函数就是生成器
def my_generator():
yield 1
yield 2
yield 3
g_obj = my_generator()
my_generate()并不会执行函数体,得到的返回值就是生成器对象,生成器对象就是迭代器对象。(函数的返回type类型就是generator)
r1 = g_obj.__next__() # 1,函数内执行一次,在遇到下一个yield的时候停止,且拿到yield的返回值
for v in g_obj:
print(v) # 2 | 3,生成器也可以被for迭代,因为生成器也是一个迭代器对象
生成器的发送信息
def fun():
r1=yield 1000
print(r1) #接收send发出的信息后,r1变成了信息1
yield 2000
obj=fun()
r1=obj.__next__() #走到第一个yield后停止,返回1000
print(r1) # 输出为1000
r1=obj.send('信息1')
print(r2) #2000