迭代器
什么是可迭代对象?
内部含有__iter__方法就是可迭代对象。
什么事迭代器?
内部含有__iter__和__next__方法的就是迭代器。
实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。
迭代器取值有两种方法。
第一种 (print(la.__next__()))
l = [1, 2, 3] la = l.__iter__() print(la.__next__()) #取值,执行一次取一个值。 print(la.__next__()) #取值,执行一次取一个值。 print(la.__next__()) #取值,执行一次取一个值。
第二种方法 for循环
l = [1, 2, 3] la = l.__iter__() print([a for a in la])
print('__next' in dir(la))
如何判断是不是迭代器或可迭代对象(有两种方式)
第一种
__iter__ in dir(数据类型)
#str类型 print('__iter__'in dir('laonanhai')) # True #列表类型 print('__iter__' in dir([1,2,3,4])) #True #字典类型 print("__iter__" in dir({'alex': 1})) #True #int类型 print("__iter__" in dir(1)) #False #bool类型 print("__iter__" in dir(bool)) #False #set类型 print("__iter__" in dir({4})) #文件句柄,既是可迭代对象,也是迭代器。 with open('log',encoding='utf-8') as f1: print("__iter__" in dir(f1)) #True print("__next__" in dir(f1)) #True
print(isinstance(range,Iterator))#False
print(isinstance(range,Iterable))#False
print('__iter__' in dir(range))#True
print('__next__' in dir(range))#False
第二种方法(需要调用一个模块模块名字叫from collections import Iterable)
from collections import Iterable l1 = 'str类型' print(isinstance(l1,Iterable)) #True l2 = [123,456] print(isinstance(l2,Iterable))#True l3 = {3:1} print(isinstance(l3,Iterable))#True l4 = {'a'} print(isinstance(l4,Iterable))#True l5 = bool print(isinstance(l5, Iterable))#False l6 = 3 print(isinstance(l6, Iterable))#False with open('log',encoding='utf-8') as f1: print(isinstance(f1, Iterable))#True
for 循环有一个机制:
1,将可迭代对象转化成迭代器。
2,利用__next__进行取值。
3,用try一场处理方法防止报错。(万能的rty都能解决)
例如:
l = [1, 2, 3, 4, 5] l_obj = l.__iter__() while True: try: print(l_obj.__next__()) except Exception: break
迭代器总结:
什么是迭代器:
1 节省内存
2,满足惰性机制
3,取值过程不可逆
可以使用__next__()来取值
可以for循环取值
生成器:
生成器的本质也是迭代器,生成器是自己用python写的迭代器。
1,通过生成器函数构造。
2,通过生成器推导式构建。
通过函数构建如下:
def func1(): print(111) print(222) print(444) yield 555 print(666) yield 555 a = func1() print(a.__next__()) print(a.__next__()) 每执行一次print(a.__next__()),就会执行第一个yield以前的值。 凡是带yield的都是迭代器。
def cloth2(): for i in range(1,10001): yield '衣服',i a = cloth2() for i in range(1,51): print(a.__next__()) for i in range(1,151): print(a.__next__())#每次自增150 print(a.__next__())#每次自增150 print(a.__next__())#每次自增150 print(a.__next__())#每次自增150 print(a.__next__())#每次自增150
def func1(): count = yield 222 print(count) yield 777 yield 888 return 888 g_obj = func1() print(g_obj.__next__()) print(g_obj.send('wusir')) print(g_obj.send('wusir'))
send
def func1(): count = yield 222 print(count) yield 777 yield 888 print(2222) yield 444 g_obj = func1() print(g_obj.__next__()) print(g_obj.send('wusir')) print(g_obj.send('111')) print(g_obj.send('wusir'))
1,send 具有next功能。
2,send 可以给上一个yield传值。
3, 第一个取值不能使用send.
4,最后一个yield不会得到send的值。、