学习迭代器之前,先搞清楚几个名词。iterable:可迭代对象;iterator:迭代器;next():下一个;iter():让……变成迭代器。
可迭代对象:能使用for循环遍历的容器对象都叫做可迭代对象。也就是可以转换为迭代器的对象就叫做可迭代对象。
迭代器:就是一个数据流对象,且是能不停地取下一个数据的对象。也就是被iter()函数变为了迭代器。但是它本质上就是一段实现数据生成的代码。
字符串str,集合set,元组tuple,列表list是可迭代对象而不是迭代器,是因为他们自身需要使用内置函数iter()将自身变为迭代器。
iter()函数的参数必须是一个可迭代对象。iter(iterable)。
目录
一,一张图弄清楚生成器,迭代器,可迭代对象的区别
二,for循环的本质
list1 = [x for x in range(20) if x % 5 == 0]
for i in list1:
print(i)
# for循环本质如下:
# 先转为一个迭代器,再next()
iterator_of_list1 = iter(list1)
while True:
try:
val = iterator_of_list1.__next__()
print(val)
except StopIteration as err:
print(err)
break
三,手动写一个迭代器
具有next()方法的对象就是可迭代对象。同时具有next()和iter()方法的是迭代器。
#这个迭代器按要求设置产生不同个数的迭代器
import time
class IteratorOfme:
def __init__(self, max_num):
self.max_num = max_num
def __iter__(self):
self.init_num = 1
return self
def __next__(self):
if self.init_num <= self.max_num:
self.init_num += 1
return self.init_num - 1
else:
raise StopIteration
ins_of_IteratorOfme = IteratorOfme(10) # 生成10个数
iterator_of_ins_of_IteratorOfme = iter(ins_of_IteratorOfme) # 必须使用iter()迭一下
while True:
time.sleep(0.5)
print(next(iterator_of_ins_of_IteratorOfme))