迭代器和iter()函数【python】

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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值