程序员

python 迭代器详述

2019-12-14  本文已影响0人  洛丽塔的云裳

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()

测试结果


上一篇下一篇

猜你喜欢

热点阅读