1. 迭代器定义
迭代器就是有一个next()方法的对象,而不是通过索引来计数。当你或是一个循环机制需要下一个项时,调用迭代器的next()方法就可以获得它。
注: 当条目全部取出后,会引发一个StopIteration异常,但并不表示错误发生,只是告诉外部调用者,迭代完成。
迭代器的限制:
你不能向后移动,不能回到开始。也不能复制一个迭代器
。如果你要再次迭代同一个对象,你只能去创建另一个迭代器对象。
2. 迭代器定义
序列
revesed()内建函数将返回一个反序访问的迭代器
enumerate()内建函数同样也返回迭代器
# -*- coding: utf-8 -*-
def main():
""" 测试迭代器 """
test = (123, 'xyz', 45.67)
fetch = iter(test)
while True:
try:
i = fetch.next()
except StopIteration:
break
print "执行其他部分"
if __name__ == '__main__':
main()
测试结果:
需要说明的是tuple的迭代器类型是
<type 'tupleiterator'>
, list的迭代器类型是<type 'listiterator'>
字典
字典的迭代器会遍历它的key,语句for eachKey in myDict
。python还引进了三个新的内建方法来定义迭代:myDict.iterkeys()
通过键迭代, myDict.itervalues
通过值迭代, myDict.iteriterms
通过键值迭代
# -*- coding: utf-8 -*-
def main():
""" 测试迭代器 """
infos = {
'Mr.chen': 60,
'Mr.wu': 70,
}
for eachinfo in infos:
print type(eachinfo), " the current info is ", eachinfo
print "****** now use iterkeys *****"
for eachkey in infos.iterkeys():
print type(eachkey), " the current info is ", eachinfo
print "****** now use itervalues *****"
for eachkey in infos.itervalues():
print type(eachkey), " the current info is ", eachinfo
print "****** now use iteritems *****"
for eachkey in infos.iteritems():
print type(eachkey), " the current info is ", eachinfo
if __name__ == '__main__':
main()
测试结果:
需要说明的是iterkeys的类型是
字典中key的类型
, itervalues类型是字典中value的类型
, iteriterms的类型是字典中key的类型
。
文件
文件对象生成的迭代器会自动调用readline()方法, 循环就可以访问文本文件的所有行。可以用 for eachline in myfile
替换 for eachline in myfile.readlines()
def main():
""" 测试迭代器 """
myfile = open('test.txt')
for eachline in myfile:
print type(eachline), eachline
if __name__ == '__main__':
main()
可变对象和迭代器
禁止在迭代可变对象的时候修改它们。一个序列的迭代器只是记录你当前到达第多少个元素,
所以如果你在迭代时改变了元素,更新会立即反映到你所在迭代的条目上
。
def main():
""" 测试迭代器 """
infos = {
'Mr.chen': 60,
'Mr.wu': 70,
}
for eachkey in infos:
print eachkey, infos['eachkey']
del infos[eachkey]
if __name__ == '__main__':
main()
测试结果
网友评论