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 Iterable print(isinstance(l,Iterable)) #True print(type(l)) #class list print(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号' %i g=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 777 g = generator() g.__next__() g.send('hello')
from collections import Iterable