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,但liststrdict、虽然都是Iterable,却不是Iterator

liststrdictIterable转换成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      #终止函数

 

posted @ 2018-02-06 16:25  短毛兔  阅读(234)  评论(0编辑  收藏  举报