Python一一迭代器和解析(一)

文件迭代器

文件对象有个方法名为readline,可以一次从一个文件中读取一行文本,每次调用readline方法时,就会前进到下一列。到达文件末尾时,就会返回空字符串。

__next__同样返回文件中的下一行,区别在于到达文件末尾时,__next__会引发内置的StopIteration异常,而不是返回空字符串。

逐行读取文本文件的最佳方式就是根本不要去读取;其替代方法就是,让for循环在每轮自动调用next从而前进到下一行。

手动迭代:iter和next

Python3.0提供了一个内置函数next,它会自动调用一个对象的__next__方法。给定一个可迭代对象X,调用next(X)等同于X.__next__().

iter内置函数,以便从可迭代对象中获得一个迭代器,返回对象含有需要的next方法。

iter对于文件来说不是必需的,因为文件对象就是自己的迭代器。也就是说,文件有自己的__next__方法,列表以及许多其他的内置对象,不是自身的迭代器,因为它们支持多次打开迭代器。对这样的对象,我们必须调用iter来启动迭代:

如下交互展示了自动和手动迭代之间的对等性:

其他内置类型迭代器

遍历字典键的经典方法是明确地获取其键的列表:

字典有一个迭代器,在迭代环境中,会自动一次返回一个键。

列表解析:初窥

列表解析基础

遍历一个列表时,我们使用range来修改:

我们可以用列表解析方式来实现类似上述循环:

列表解析写在一个方括号中,因为它们最终是构建一个新的列表的一种方式。

优点:列表解析比手动的for循环语句运行的更快,因为它们的迭代在解释器内部是以C语言的速度执行的,而不是以手动Python代码执行的,特别是对于较大的数据集合。

在文件上使用列表解析

文件对象有一个readlines方法,它能一次性地把文件载入到行字符串的一个列表中:

上述实例,如果我们希望一次性去除换行符合,我们可以采用列表解析的方式:

除了高效性,列表解析的表现力也很强,我们可以在迭代时在一个文件的行上运行任何的字符串操作,例如,当字符串方法返回一个新的字符串,可以对该字符串应用其他的字符串方法:

扩展的列表解析语法

高级用法,例如可以在表达式中添加一条if过滤子句:

同等情况下,我们也可以用for循环来实现,但是,它占据了4行而不是一行,并且可能运行起来要慢很多

也可能包含嵌套的循环,也可能被编写为一系列的for子句。实际上,它们的完整语法允许任意数目的for子句,例如,如下收集两个字符串中的字符排列:

其他迭代环境

列表解析、in成员关系测试、map内置函数以及像sorted和zip调用这样的内置函数也都使用了迭代协议。当应用于一个文件时,所有这些使用文件对象的迭代器都自动地按行扫描:

Python3.0中新的可迭代对象

range迭代器

Python3.0中range对象只支持迭代、索引以及len函数,不支持任何其他的序列操作。(如果你需要更多列表工具的话,使用list(...))

map、zip和filter迭代器

和range类似:它们在Python3.0中也可以变成迭代器以节约内存空间,而不再在内存中一次性生成一个结果列表。所有这3个函数不仅像是在Python2.X一样处理可迭代对象,而且在Python3.0中返回可迭代结果。

和range不同:它们都是自己的迭代器一一在遍历其结果一次之后,它们就用尽了。换句话说,不能在它们的结果上拥有在那些结果中保持不同位置的多个迭代器

多个迭代器VS单个迭代器

range对象,它只支持len和索引,它不是自己的迭代器(手动迭代,我们使用iter产生一个迭代器),并且,它支持在其结果上的多个迭代器,这些迭代器会记住它们各自的位置:

相反,zip、map和filter不支持相同结果上的多个活跃迭代器:

字典视图迭代器

在Python3.0中,字典的keys、values和items方法返回可迭代的视图对象,它们一次产生一个结果项,而不是在内存中一次产生全部结果列表。视图项保持和字典中的那些项相同的物理顺序,并且反映对底层的字典做出的修改。

和所有迭代器一样,总可以通过把一个Python3.0字典视图传递到list内置函数中,从而强制构建一个真正的列表。

此外,Python3.0中字典仍然有自己的迭代器,它返回连续的键,因此,无需直接在此环境中使用keys:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值