迭代器
-
迭代的概念
-
给定一个列表或者元祖,可以通过使用for循环来遍历这个列表或者元祖,我们把则把这种遍历称作迭代,迭代读取一条数据供我们使用的对象称之为可迭代对象 。
-
my_l = [1,2,3,4,5] for i in my_l: print(i)
-
-
在我们python中:
-
在类里面定义iter方法创建的对象就是可迭代对象
-
def myIter(): def __iter__(self): pass
-
def myIter(): def __iter__(self): pass def __next__(self): pass
-
from collections import Iterable result = isinstance((3,5), Iterable) # 运行结果True
-
from collections import Iterator result = isinstance((3,5), Iterator) # 运行结果 False
-
# 自定义可迭代对象: 在类里面定义__iter__方法创建的对象就是可迭代对象 class MyList(object): def __init__(self): self.my_list =list() # 添加指定元素 def append_item(self, item): self.my_list.append(item) def __iter__(self): # 可迭代对象的本质:遍历可迭代对象的时候其实获取的是可迭代对象的迭代器, 然后通过迭代器获取对象中的数据 my_iterator = MyIterator(self.my_list) return my_iterator # 自定义迭代器对象: 在类里面定义__iter__和__next__方法创建的对象就是迭代器对象 class MyIterator(object): def __init__(self, my_list): self.my_list = my_list # 记录当前获取数据的下标 self.current_index =0 # 判断当前对象是否是迭代器 result =isinstance(self, Iterator) print("MyIterator创建的对象是否是迭代器:", result) def __iter__(self): return self # 获取迭代器中下一个值 def __next__(self): if self.current_index self.current_index +=1 return self.my_list[self.current_index -1] else: # 数据取完了,需要抛出一个停止迭代的异常 raise StopIteration my_list = MyList() my_list.append_item(1) my_list.append_item(2) result =isinstance(my_list, Iterable) print(result) for value in my_list: print(value)
-
iter()函数与next()函数
-
iter函数: 获取可迭代对象的迭代器,会调用可迭代对象身上的iter方法
next函数: 获取迭代器中下一个值,会调用迭代器对象身上的next方法
-
for循环的本质
-
先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。
-
-
迭代器的使用场景
-
迭代器最核心的功能就是可以通过next()函数的调用来返回下一个数据值。如果每次返回的数据值不是在一个已有的数据集合中读取的,而是通过程序按照一定的规律计算生成的,那么也就意味着可以不用再依赖一个已有的数据集合,也就是说不用再将所有要迭代的数据都一次性缓存下来供后续依次读取,这样可以节省大量的存储(内存)空间。
-
生成斐波那契数列:后一个数是前两个数之和。
0,1,1,2,3,5,8,13。。。
-
class FibIterator(object): """斐波那契数列迭代器""" def __init__(self, n): """ :param n: int, 指明生成数列的前n个数 """ self.n = n # current用来保存当前生成到数列中的第几个数了 self.current = 0 # num1用来保存前前一个数,初始值为数列中的第一个数0 self.num1 = 0 # num2用来保存前一个数,初始值为数列中的第二个数1 self.num2 = 1 def __next__(self): """被next()函数调用来获取下一个数""" if self.current < self.n: num = self.num1 self.num1, self.num2 = self.num2, self.num1+self.num2 self.current += 1 return num else: raise StopIteration def __iter__(self): """迭代器的__iter__返回自身即可""" return self if __name__ == '__main__': fib = FibIterator(10) for num in fib: print(num, end=" ")
-
总结
-
可迭代对象不一定是迭代器对象
-
迭代器对象一定是可迭代对象
-
for循环获取数据线创建迭代器对象然后调用next方法
-
使用迭代器可以大大节省内存空间
-
-
-
学IT,上博学谷
-