1、迭代器
内部含有__iter__方法的对象就叫做可迭代对象
可迭代对象遵循可迭代协议
for循环可以循环的就是可迭代对象
可迭代对象:str,list,set,dict,tuple,range,
迭代器:f1文件句柄
如何判断 两种方式
s='laonanhai'print('__iter__' in dir(s))
l=[1,2,3,4] from collections import Iterableprint(isinstance(l,Iterable)) #Trueprint(type(l)) #class listprint(isinstance(l,list)) #True
迭代器
l1=[1,2,3]
可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器
迭代器不仅含有__iter,还含有__next__ 遵循迭代器协议
l1_obj=l1__iter__() #迭代器print('__iter__' in dir(l1_obj))print('__next__' in dir(l1))print('__next__' in dir(l1_obj))print(l1_obj.__next__())for i in l1_obj: print(i)
判断迭代器:
print('__iter__' in dir(s))
print('__iter__' in dir(s))
print(isinstance(s,Iterable))
迭代器的好处:
1、节省内存空间
2、满足惰性机制
3、不能反复取值,不可逆
#1、将可迭代对象转化成迭代器#2、内部使用__next__方法取值#3、运用了异常处理去处理报错l2=[1,2,3,4,5,6,7,8]l2_obj=l2.__iter__()while True: try: i=l2_obj.__next__() print(i) except Exception: break
2、生成器
生成器本质上是迭代器
l=[1,2,3]
l.__iter__()
生成器的产生方式:
1、生成器函数构造
2、生成器推导式构造
3、数据类型的转化
def func1(): print(111) print(222) print(333) yield 666 yield 555 yield 777print(g.__next__())print(g.__next__())print(g.__next__())
第一:函数中只要有yield那他就不是一个函数,而是一个生成器
第二:g称为生成器对象
def func1(): for i in range(1,10001): yield '老男孩校服%d号' %ig=func1()for i in range(50): print(g.__next__())for j in range(150): print(g.__next__())
l1=[i for i in range(1000)]print(l1)
send:next和send功能一样,都是执行一次
send可以给上一个yield赋值
def generator(): print(123) content = yield 666 print(content) print(456) yield 777g = generator()g.__next__()g.send('hello')
from collections import Iterable