
@R星校长
第4关:迭代器
迭代器用来循环访问一系列元素,它不仅可以迭代序列,也可以迭代不是序列但是表现出序列行为的对象。本关的任务是让学习者理解与学会使用迭代器。
迭代器的优点
迭代器访问与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),不可使用赋值的方法,这样是不起作用的。
如果您想了解更多迭代器的相关知识,请参考:[美] Wesley J.Chun 著《 Python 核心编程》第八章。
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
预期输入:
5,6,7,8,9

只要认为是对的就去做,坚持去做。不要在乎别人的看法,哪怕是错,至少你有去做过证明曾经你努力过。
