可迭代对象
对象内部含有 __iter__方法就是可迭代对象。
可迭代对象:str list dict tuple set range()
可迭代对象满足可迭代协议
判断一个对象是否可迭代:
第一个方法:
print('__iter__ in dir(s))
第二个方法:
from collections import Iterable # 判断可迭代对象 from collections import Iterator # 判断迭代器 print(isinstance('alex', Iterable)) # 判断类型
迭代器:
对象内部含有__iter__方法,且含有__next__方法就是迭代器。
判断一个对象是否迭代器:
print('__next__' in dir(f))
# 可迭代对象 # for i in 'abc': # # print(i) # 对象内部含有 __iter__ 方法就是可迭代对象。 # s = '123' # print(dir(s)) # 判断一个对象是否可迭代对象: # 第一种方法 # print('__iter__' in dir(s)) # 第二种方法 from collections import Iterable # 判断可迭代对象 from collections import Iterator # 判断迭代器 print(isinstance('alex', Iterable)) # 判断类型 # 迭代器 # 判断一个对象是否可迭代器 f = open('a', encoding='utf-8', mode='w') print('__next__' in dir(f))
可迭代对象 vs 迭代器
- 1. 可迭代对象不能取值,迭代器是可以取值的。
- 可迭代对象 --->(转化成) 迭代器:
- 2. 迭代器非常节省内存。
- 只加载一个内存地址,next一下,加载这个内存的地址+
- 3. 迭代器每次只会取一个值。
- 4. 迭代器单向的,不反复,一条路走到头。会记录地址
数据量很大 只是取值 用迭代器。
while循环 模拟 for 循环内部机制:
- 1. 将可迭代对象转化成迭代器。
- 2. 调用__next__ 方法取值
- 3. 利用异常处理停止报错
# 可迭代对象 --->(转化成) 迭代器: lis = [1, 2, 3] # 可迭代对象 ite1 = lis.__iter__() # 迭代器 print(ite1) # 迭代器如何取值 next一次,取一个值 print(ite1.__next__()) # 写一步 取一个 # while循环 模拟 for 循环: # 1. 将可迭代对象转化成迭代器。 # 2. 调用__next__ 方法取值 # 3. 利用异常处理停止报错 s = 'sdgs' iter2 = s.__iter__() while 1: try: print(iter2.__next__()) except StopIteration: break