#可迭代对象,方法是否包含'__iter__'
s='ashh'
print('__next__' in dir(s)) #False
#可迭代器,方法是否包含'__iter__' and '__next__'
with open('文件',encoding='utf-8',mode='w') as f1:
print('__iter__' in dir(f1) and ('__next__' in dir(f1))) #True
##可迭代对象不能直接取值,迭代器可取值。
##可迭代对象可以转成迭代器
obj=s.__iter__() #obj=iter(s)一样的
print(obj.__next__()) #a
print(obj.__next__()) #s
print(obj.__next__()) #h
aa=[11,33,55]
obj1=iter(aa)
print(next(obj1)) #11
##优点:节省内存
##迭代器可以记住上次循环的位置
obj2=iter(aa)
for i in aa:
print(next(obj2))
i+=1
##缺点速度慢
s=0
while s>1:
try:
print(next(obj2))
except StopIteration:
break
s+=1
def func():
yield 3
yield 4
ret=func()
print(next(ret)) #3 一个next对应一个yield
print(next(ret)) #4
##yield将列表编程迭代器
def func():
ll=[1,2,3,4]
yield from ll
# yield 1
# yield 2
ret=func()
print(next(ret)) #1
print(next(ret)) #2