一、迭代器
现在已知的可迭代对象:str list tuple dict set range和文件句柄。
但是,什么是可迭代对象?可迭代对象的测量方法。
方法一: dir(被测对象) 如果 他含有__iter__ ,那这个对象就叫做可迭代对象.
下面字符串S就是可迭代对象:
s= ‘abcdef‘
print(‘__iter__‘ in dir(s))
可迭代对象,iterable 与迭代器有什么关系?可迭代对象可以转换成迭代器(可迭代对象.__iter__())。
s1 = s.__iter__()
print(s1) #iterator 遵循迭代器协议
迭代器的取值:(迭代器.__next__())
#迭代器取值:
s2 = ‘abcd‘
s3 = s2.__iter__()
print(s3.__next__()) #a
print(s3.__next__()) #b
只含有__iter__方法的数据是可迭代对象,含有__iter__方法,并且含有__next__方法的数据是迭代器
#迭代器的判断:有__iter__方法,并且含有__next__方法的数据是迭代器
l = [1,2,3,4]
print(‘__iter__‘ in dir(l)) #True
print(‘__next__‘ in dir(l)) #False
liter = l.__iter__()
print(‘__next__‘ in dir(liter)) #True
print(liter.__next__()) #1
print(liter.__next__()) #2
print(liter.__next__()) #3
print(liter.__next__()) #4
方法二:测量他是可迭代的还是迭代器:
# 方法二 测试他是迭代器还是可迭代对象
l = [1,2,3]
l_iter = l.__iter__()
from collections import Iterable
from collections import Iterator
print(isinstance(l,Iterable)) #True
print(isinstance(l,Iterator)) #False
print(isinstance(l_iter,Iterator)) #True
print(isinstance(l,list)) #Truedied
迭代器的意义:
1)、迭代器节省内存.
2)、迭代器惰性机制.
3)、迭代器不能反复,一直向下执行.
for 循环的内部机制:
1)、内部含有__iter__方法,他会将可迭代对象先转化成迭代器.
2)、然后在调用__next__方法.
3)、for循环有异常处理的方法.
#用迭代器来表示for循环的内部机制
for i in [1,2,3]:
print(i)
l = [1,2,3]
l_iter = l.__iter__()
while True:
try:
print(l_iter.__next__())
except StopIteration:
break
二、生成器