python 一切皆对象, 能被for循环的对象就是可迭代对象。
迭代器: f1文件句柄
dir打印该对象的所有操作方法
s = 'python' print(dir(s))
执行输出:
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
一、可迭代对象
对象内部含有__iter__方法就是可迭代对象,例如 str、list、dict、tuple、set、range()
查看某个对象是否是可迭代对象,有2种方式
- print('__iter__' in dir(对象))
- from collections import Iterable
print(isinstance(对象,Iterable))
第一种:
s = 'python' print('__iter__' in dir(s))
执行输出:True
第二种:
from collections import Iterable l = [1, 2, 3, 4] print(isinstance(l, Iterable)) # True
二、迭代器
对象内部含有__iter__和__next__方法就是迭代器,文件句柄就是迭代器。
1. 可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器
l1 = [1,2,3] l1_obj = l1.__iter__() # 迭代器 print(l1_obj)# 表示它是一个列表迭代器对象
2. 判断方法是否是迭代器的方法
①print('__iter__' in dir(对象))
print('__next__' in dir(对象))
两个都必须是True, 这种方法居多
② from collection import Iterator
print(isinstance(对象,Iterator))
方法1:
with open('a', encoding='utf-8') as f1: print('__iter__'in dir(f1)) print('__next__'in dir(f1))
方法2:
from collections import Iterator print(isinstance(f1,Iterator)) # True
例:
l1 = [1,2,3] l1_obj = l1.__iter__() # 转换为迭代器 print('__iter__' in dir(l1_obj)) print('__next__' in dir(l1_obj))
执行输出:从结果中,可以看出l1_obj是同时含有__iter__和__next__的对象,所以它是迭代器 True True
3. 迭代器使用__next__()获取一个值
l1 = [1,2,3] l1_obj = l1.__iter__() # 迭代器 print(l1_obj.__next__()) # 获取一个元素 print(l1_obj.__next__()) print(l1_obj.__next__()) print(l1_obj.__next__())
多取了一个,就会报错,因为列表只有3个元素
s1 = 'sadda' ite1 = iter(s1) while 1: try: print(ite1.__next__()) except StopIteration: break
面试题:使用whlie循环去遍历一个有限对象
l2 = [1, 2, 3, 4, 5, 6, 7, 8] l2_obj = l2.__iter__() #1.将可迭代对象转化成迭代器 while True: try: i = l2_obj.__next__() #内部使用__next__方法取值 print(i) except Exception: #运用了异常处理去处理报错 break
for循环的内部运行机制:
① 将可迭代对象转化为迭代器
② 调用__next__方法取值
③ 利用异常处理机制停止报错
l1 = [1,2,3] l1_obj = l1.__iter__() # 转换为迭代器 for i in l1_obj: print(i)
执行输出:for循环的内部机制,就是用__next__方法执行的。为什么没有报错呢?它内部有异常处理机制 1 2 3
三、迭代器的好处
1)节省内存空间。迭代器最大的好处。好的程序员,会在内存优化方面考虑,比如迭代器。
2)满足惰性机制。
3)不能反复取值,不可逆。不可逆,表示,已经取过的值,不能再次取,它只能取下一个。
总结:
1.什么是可迭代对象,什么是迭代器
仅含有__iter__方法的对象,就是可迭代对象; 包含__iter__和__next__方法的对象,就是迭代器
2.可迭代对象如何转化成迭代器
转化成迭代器:可迭代对象.__iter__()
例如
l1 = [1,2,3] l1_obj = l1.__iter__()
3.迭代器如何取值
迭代器使用__next__()方法