Python之迭代器

迭代器


一.迭代器的优点

迭代器访问与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),不可使用赋值的方法,这样是不起作用的。

例题示范:
补全ListCalculate.py文件中的部分代码,具体要求如下:
当输入一个列表时,填入将列表List转换为迭代器的代码;
填入用next()函数遍历迭代器IterList的代码。
代码示例:

List = []
member = input()
for i in member.split(','):
    result = i
    List.append(result)
#请在此添加代码,将List转换为迭代器的代码
#********** Begin *********#
IterList=iter(List)
#********** End **********#
while True:
    try:
        #请在此添加代码,用next()函数遍历IterList的代码
        #********** Begin *********#
        num=next(IterList)
        #********** End **********#
        result = int(num) * 2
        print(result)
    except StopIteration:
        break
上一篇:Python(4)


下一篇:Java泛型 PECS(Producer Extends, Consumer Super)