8.12 迭代器
定义
迭代器:迭代的工具。迭代是更新换代,如你爷爷生了你爹,你爹生了你,迭代也可以说成是重复,并且但每一次的重复都是基于上一次的结果来的。
可迭代对象
python中,一切皆对象:
x = 1 name = 'nick' lis = [1, 2] tup = (1, 2) dic = {'name': 'nick'} s1 = {'a', 'b'} f = open('49w.txt', 'w', encoding='utf-8) def func(): pass
对于这一切的对象中,但凡有__iter__
方法的对象,都是可迭代对象。
# 以下都是可迭代的对象 name = 'nick'.__iter__ lis = [1, 2].__iter__ tup = (1, 2).__iter__ dic = {'name': 'nick'}.__iter__ s1 = {'a', 'b'}.__iter__ f = open('49w.txt', 'w', encoding='utf-8') f.__iter__
可迭代的对象:Python内置str、list、tuple、dict、set、file都是可迭代对象。
特点:内置有__iter__
方法的都叫可迭代的对象。
迭代器对象
只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。
在找到该方法前,首先我们给出迭代器对象的概念:可迭代的对象执行__iter__
方法得到的返回值。并且可迭代对象会有一个__next__
方法。
# 不依赖索引的数据类型迭代取值 dic = {'a': 1, 'b': 2, 'c': 3} iter_dic = dic.__iter__() print(iter_dic.__next__()) print(iter_dic.__next__()) print(iter_dic.__next__()) # print(iter_dic.__next__()) # StopIteration: """ a b c """ # 依赖索引的数据类型迭代取值 lis = [1, 2, 3] iter_lis = lis.__iter__() print(iter_lis.__next__()) print(iter_lis.__next__()) print(iter_lis.__next__()) # print(iter_lis.__next__()) # StopIteration: ''' 1 2 3 '''
for循环原理
for 循环就是利用可迭代对象进行while循环+try...except实现的
- 首先使用iter把lt变成迭代器对象;对于文件也要使用iter方法吧文件再一次iter下
- 然后使用next方法进行迭代取值
- 判断StopIteration异常,遇到异常终止
例如:
lt = [1,2,3] for i in lt: print(i) lt_iter = lt.__iter__() while 1: try: print(lt_iter.__next__()) except StopIteration: break
扩展-iter可当作内置方法来使用,但**尽量使用__iter__**
dic ={'a':1,'b':2} dic_iter = iter(dic) print(next(dic_iter)) print(next(dic_iter))