23_迭代器、模拟For循环
一、可迭代对象 和 迭代器
1.可迭代对象和迭代器
可迭代对象:可以直接作用于for循环的对象统称为可迭代对象,Iterable.
迭代器:可以被next()函数调用并不断返回下一个值的对象称为迭代器,Iterator.
2.判断某个对象是否是可迭代对象
dir() 会打印出对象的所有内置属性和方法,然后判断所有的属性和方法中是否存在'__iter__'.
1 l = [1,2,3,4] 2 print(dir(l)) #他会把列表的所有方法和属性打印出来.返回的是一个列表 3 print('__iter__' in dir(l)) #True 如果对象包含__iter__ ,就表明是一个可迭代对象
isinstance() 可以判断一个对象是否是可迭代对象Iterable
1 from collections import Iterable 2 3 4 l = [1,2,3,4] 5 print(isinstance(l,Iterable)) #如果返回True ,表明对象是可迭代对象
3.判断某个对象是否是迭代器
dir() : 判断对象的所有内置方法和属性中是否包含'__next__'.
1 print('__next__' in dir([]))#False 列表不是迭代器 2 print('__next__' in dir(''))#False 字符串不是迭代器 3 print('__next__' in dir({}))#False 字典不是迭代器
isinstance() :可以判断对象是否是迭代器。
1 print(isinstance('',Iterator)) #False 2 print(isinstance([],Iterator)) #False 3 print(isinstance({},Iterator)) #False 4 print(isinstance(iter([]),Iterator)) #True 5 print(isinstance(iter(''),Iterator)) #True 6 print(isinstance(iter({}),Iterator)) #True
4.可迭代对象 转化成 迭代器
生成器都是Iterator,但list、str、dict、虽然都是Iterable,却不是Iterator。
把list、str、dict等Iterable转换成Iterator可以使用'__iter__() '或 iter()函数:
1 print(isinstance(''.__iter__(),Iterator)) #True 2 print(isinstance([].__iter__(),Iterator)) #True 3 print(isinstance({}.__iter__(),Iterator)) #True 4 print(isinstance(iter([]),Iterator)) #True 5 print(isinstance(iter(''),Iterator)) #True 6 print(isinstance(iter({}),Iterator)) #True
5.迭代器的特点
1.节省内存 2.迭代器惰性机制 3.迭代器不能反复,一直向下执行
6.文件句柄就是一个迭代器
我们通过open()方法可以获得一个文件句柄,通过文件句柄我们可以操作文件。文件句柄就是一个迭代器。
1 #文件句柄是一个迭代器 2 with open('text.txt',encoding='utf-8') as f_read: 3 print(isinstance(f_read,Iterator)) #True 4 pass
二、For循环的机制 - 模拟For循环
for循环是一种迭代循环机制,在内部调用next(),并捕获异常(StopIteration ),终止循环的操作
1 #模仿 for 循环 2 3 L = [1,2,3,4] 4 5 #for循环实现 6 for i in L: 7 #print(i) 打印 1 2 3 4 8 pass 9 10 L = L.__iter__() #L 列表从 可迭代对象转换成了迭代器 11 while True: 12 try: 13 print(L.__next__()) # 每次打印出 L 的元素 14 except StopIteration: #迭代器next()在所有元素取出完后,引发StopIteration异常 15 break #终止函数