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