1.1迭代器定义
迭代器为类的序列对象提供了一个类序列的接口。也可以迭代不是序列但表现出序列行为的对象,例如字典的键,一个文件的行,等等。
1.2为什么需要迭代器
1.提供了可扩展的迭代器接口;
2.对列表迭代带来了性能上的增强;
3.在字典迭代中性能提升;
4.创建真正的迭代接口,而不是原来的随机对象访问;
5.与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容;
6.迭代非序列集合(例如映射和文件)时,可以创建更简洁可读的代码。
1.3如何迭代
根本上说,迭代器就是有一个next()方法的对象,而不是通过索来计数。当你或是一个循环机制(例如for语句)需要下一个项时,调用迭代器的next(I)方法就可以获得它。条目全部取出后,会引发一个StopIterationy异常,这并不表示错误发生,只是告诉外部调用者,迭代完成。
迭代器也有一些限制。例如你不能向后移动,不能回到开始,也不能复制一个迭代器。如果你要再次(或者是)同时迭代同个对象,你只能创建另一个迭代器对象。
1.4使用迭代器1
1.序列
>>>myTuple = (123, 'xyz', 45.67)
>>>i=iter(myTuple)
>>>i.next()
123
>>>i.next()
'xyz'
>>>i.next()
45.67
>>>i.next()
#StopIteration
把代码放在try-except块中。序列现在会自动地产生它们自己的迭代器,所以一个for循环:
for i in seq:
do_something_to(i)
under the covers now really behaves like this:
实际上是这样工作的:
fetch = iter(seq)
while True:
try:
i=fetch.next()
except StopIteration:
break
do_something_to(i)
2.字典
字典和文件是另外两个可迭代的Python数据类型。字典的迭代器会遍历它的键(key)。语句for eachKey in myDict.keys() 可以缩写为for eachKey in myDict,例如:
>>>legends = { ('poe','author'):(1809,1849,1976),
('Gaudi','architect'):(1852,1906,1987),
('Freud','psychoanalyst'):(1856,1939,1990)
}
>>>for eachLegend in legends:
print 'Name: %s\tOccupation: %s' % eachLengend
print ' Birth: %s\tDeath: %s\tAlbum: %s\n'\
% lengends[eachLengend]
Name:Freud Occupation: psychoanalyst
Birth: 1856 Death:1939 Album:1990
Name:Poe Occupation:author
Birth:1809 Death:1849 Album:1976
Name:Gaudi Occupation:architect
Birth:1852 Death:1906 Album:1987
另外,Python还引进了三个新的内建字典方法来定义迭代:myDict.iterkeys()(通过键迭代),myDict.itervalues()(通过值迭代)及myDicit.iteritems()(通过键-值对来迭代)。注意,in操作符也可以用于检查字典的键是否存在,之前的布尔表达式myDict.has_key(anyKey)可以被简写为anyKey in myDict.
3.文件
文件对象生成的迭代器会自动调用readline()方法。这样,循环就可以访问文本文件的所有行。可以使用更简单的for eachLine in myFile 替换 for eachLine in myFile.readlines():
>>>myFile = open(' config-win.txt')
>>>for eachLine in myFile:
print eachLine, #comma suppresses extra \n
[EditorWindow]
font-name:courier new
font-size:10
>>>myFile.close()