Python-迭代器
迭代器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
创建一个可迭代对象
可迭代对象的本质
可迭代对象的本质就是可以向我们提供一个这样的中间“人”即迭代器帮助我们对其进行迭代遍历使用。
可迭代对象通过__iter__
方法向我们提供一个迭代器,我们在迭代一个可迭代对象的时候,实际上就是先获取该对象提供的一个迭代器,然后通过这个迭代器来依次获取对象中的每一个数据.
那么也就是说,一个具备了__iter__
方法的对象,就是一个可迭代对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# 迭代类 from collections import Iterable from collections import Iterator ''' from collections import Iterable 判断是否是可迭代对象 from collections import Iterator 判断是否是迭代器 如果一个类中有__iter__方法 则代表它是一个可迭代对象,因此创建一个迭代对象,需要类具有__iter__方法 并且__iter__返回了一个具有__iter__ 和 __next__ 的对象的引用 for循环时 1、判断迭代的对象是否可以迭代 isinstance(',',Iterable) 2、调用iter函数获取__iter__ 的返回值 想要执行类中的__iter__方法,调用iter(类名)函数,形参为类名 3、__iter__ 的返回值是一个迭代器 每次循环调用 对象中__next__方法 返回什么 就显示什么 什么叫做迭代器? 具有__iter__ 和 __next__ 的对象叫做迭代器 一个对象如果是迭代器 那么他一定可以迭代 但是一个可迭代对象 不一定是迭代器 ''' # 迭代对象 可以使用for class Demo(object): def __init__(self): self.name = ['niuniu', 'houyafan'] self.num = 0 # 实现iter方法可以进行for循环 def __iter__(self): # 返回一个具有__iter__ 和 __next__ 的对象的引用 # self代指本类 返回的对象中自然包括__next__ 和 __iter__ return self def __next__(self): # 达成某种条件 才可以有返回值 if self.num < len(self.name): res = self.name[self.num] self.num += 1 return res else: # 循环时需要终止 通过主动抛出异常 for循环接收到就会停止 raise StopIteration d = Demo() print('判断对象 d 是否是可迭代对象', isinstance(d, Iterable)) # 代用类中的 __iter__ 方法并获取返回值 class_iter = iter(d) print('判断 迭代对象 __iter__的返回值是否是一个迭代器', isinstance(class_iter, Iterator)) # 通过next函数 调用迭代器的__next__ 并获取返回值 next_res = next(class_iter) for i in d: print(i) |
迭代器的应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
''' 迭代器是生成一个数据的逻辑,主要体现在next中写各种各样的逻辑 返回的是一个对象 而不是数据生成好放在那里,当调用的时候才会生成 迭代器的优点: 因为存储的是数据生成的逻辑,不是完整的数据,所以占用的内存空间特别小 用时在生成 迭代器的例子: 元组 a = (1,2,3) 将元组a转换为列表b 实现b = list(a) 迭代器的应用: 如果有一种数据是固定格式或有固定逻辑,则可以通过写一个迭代器将他的生成逻辑写好 通过调用next的方式来获取数据或者通过for循环直接进行读取 ''' a = (1, 2, 3) class TupleToList(object): def __init__(self, tmpTuple): self.tmpTuple = tmpTuple self.num = 0 self.tmpList = [] def __iter__(self): return self def __next__(self): if self.num < len(self.tmpTuple): for t in self.tmpTuple: self.tmpList.append(t) self.num += 1 return self.tmpList else: raise StopIteration # 通过迭代器实现元组转列表,调用迭代器的next函数 b = next(TupleToList(a)) print(b) |
未经允许不得转载:大师兄 » Python-迭代器