迭代器
迭代器用来循环访问一系列元素,它不仅可以迭代序列,也可以迭代不是序列但是表现出序列行为的对象。
迭代器的优点
- 迭代器访问与
for
循环访问非常相似,但是也有不同之处。对于支持随机访问的数据结构如元组和列表,迭代器并无优势。因为迭代器在访问的时候会丢失数据索引值,但是如果遇到无法随机访问的数据结构如集合时,迭代器是唯一访问元素的方式; -
迭代器仅仅在访问到某个元素时才使用该元素。在这之前,元素可以不存在,所以迭代器很适用于迭代一些无法预先知道元素总数的巨大的集合;
-
迭代器提供了一个统一的访问集合的接口,定义
iter()
方法对象,就可以使用迭代器访问。
理解迭代器
可直接作用于for
循环的数据类型如list
、tuple
、dict
等统称为可迭代对象:Iterable
。使用isinstance()
可以判断一个对象是否是可迭代对象。例如:
from collections import Iterable
result = isinstance([],Iterable)
print(result)
result = isinstance((),Iterable)
print(result)
result = isinstance('python',Iterable)
print(result)
result = isinstance(213,Iterable)
print(result)
输出:
True
True
True
False
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。next()
函数访问每一个对象,直到对象访问完毕,返回一个StopIteration
异常。使用isinstance()
可以判断一个对象是否是Iterator
对象。例如:
from collections import Iterator
result = isinstance([],Iterator)
print(result)
result = isinstance((),Iterator)
print(result)
result = isinstance((x for x in range(10)),Iterator)
print(result)
输出:
False
False
True
所有的Iterable
都可以通过iter()
函数转化为Iterator
。
定义迭代器
当自己定义迭代器时,需要定义一个类。类里面包含一个iter()
函数,这个函数能够返回一个带next()
方法的对象。例如:
class MyIterable:
def __iter__(self):
return MyIterator()
class MyIterator:
def __init__(self):
self.num = 0
def __next__(self):
self.num += 1
if self.num >= 10:
raise StopIteration
return self.num
复制迭代器
迭代器当一次迭代完毕后就结束了,在此调用便会引发StopIteration
异常。如果想要将迭代器保存起来,可以使用复制的方法:copy.deepcopy():x = copy.deepcopy(y)
,不可使用赋值的方法,这样是不起作用的。