一、可迭代对象与迭代器对象
在遍历一个非常大的文件时如果一次性读取全部内容然后在进行输出可能会导致内存不够的想象,正确的方式应该是读取一条输出一条,这样可以极大的节约内容空间,那么如何实现对象的迭代?
首先来看看 可迭代
、迭代器
的区别:
可迭代
既可迭代对象
,指的是可以通过for
循环进行遍历的对象,常见的 list, string, tuple, set, dict 等都是可迭代对象
,数字不是可迭代对象。如果一个对象实现了__iter__方法,这个对象就是可迭代对象。迭代器
既迭代器对象
指实现了__iter__方法和__next__方法的对象,迭代器
对象可以通过调用 iter 函数且入参为可迭代对象
生成。
可迭代对象不一定是迭代器,迭代器一定是可迭代对象,可迭代对象只需实现一个 __iter__
方法,而迭代器需要实现 __iter__
方法和 __next__
方法。
# 可迭代对象 list_data = ['peter', 'tom', 'clint', 'stark'] string_data = 'Stark' for item in list_data: print(item) for str in string_data: print(str) 复制代码
执行上述代码,输出结果如下:
peter tom clint stark S t a r k 复制代码
Python 中 list
、string
等都可以使用 for
循环进行遍历,都是可迭代对象
list_data = ['peter', 'tom', 'clint', 'stark'] string_data = 'Stark Industry' print(iter(list_data)) print(type(iter(list_data))) print(iter(string_data)) print(type(iter(string_data))) print(iter(1)) 复制代码
执行上述代码,输入结果如下:
<list_iterator object at 0x102692d90> <class 'list_iterator'> <str_iterator object at 0x102692d90> <class 'str_iterator'> <font color="orange"> Traceback (most recent call last): "/python-tricks/ex1.py", line 17, in <module> print(iter(1)) TypeError: 'int' object is not iterable 复制代码
iter 函数传入可迭代对象返回的是一个迭代器对象 list_iterator object at 0x102692d90
, 对象的类型是 class 'list_iterator'
,iter 函数传入一个数字对象是无法返回迭代器的,应为int 类型数字是不可迭代的。
list_data = ['peter', 'tom', 'clint', 'stark'] string_data = 'Stark Industry' print(dir(list_data)) print(list_data.__iter__()) print(iter(list_data)) 复制代码
执行上述代码,输出内容如下:
list 可迭代对象实现了 __iter__
方法,并且根据输出结果来看可迭代对象调用__iter__
方法的返回值和 iter
函数传入一个可迭代对象的返回值是相同的。
iter
函数调用时会首先找到 __iter__
方法,如果该方法没有找到,存在在 __getitem__
方法也是可以的,字符串在 Python2 中只包含了 __getitem__
方法,在 Python3 中两个方法都包含。
迭代器可以调用 __next__
方法进行迭代输出元素,也可以通过 next
方法传入一个迭代器对象来进行迭代。
list_data = ['peter', 'tom', 'clint', 'stark'] list_iterator = iter(list_data) print(dir(list_iterator)) print(next(list_iterator)) print(next(list_iterator)) print(next(list_iterator)) print(next(list_iterator)) print(next(list_iterator)) 复制代码
执行上述代码,输出结果如下:
列表中只有四个元素,当迭代到第 5 个元素时列表不存在,所以抛出异常。