4.8 跳过可迭代对象的开始部分.pdf

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.8 跳过可迭代对象的开始部分

4.8 跳过可迭代对象的开始部分 问题 你想遍历⼀个可迭代对象,但是它开始的某些元素你并不感兴趣,想跳过它们。 解决⽅案 itertools 块中有⼀些函数可以完成这个任务。⾸先介绍的是 itertools.dropwhile() 函数。使⽤时,你给它传递⼀个函数对象和⼀个可迭代 对象。它会返回⼀个迭代器对象,丢弃原有序列中直到函数返回True之前的所有元 素,然后返回后⾯所有元素。 为了演⽰,假定你在读取⼀个开始部分是⼏⾏注释的源⽂件。⽐如: with open(/etc/passwd) as f: ... for line in f: ... print(line, end=) ... ## # User Database # # Note that this file is consulted directl onl when the s stem i # in single-user mode. At other times, this information is provide # Open Director . ... ## nobod :*:-2:-2:Unprivileged User:/var/empt :/usr/bin/false root:*:0:0:S stem Administrator:/var/root:/bin/sh ... 如果你想跳过开始部分的注释⾏的话,可以这样做: from itertools import dropwhile with open(/etc/passwd) as f: ... for line in dropwhile(lambda line: line.startswith(#), f ... print(line, end=) ... nobod :*:-2:-2:Unprivileged User:/var/empt :/usr/bin/false root:*:0:0:S stem Administrator:/var/root:/bin/sh ... 这个例⼦是基于根据某个测试函数跳过开始的元素。如果你已经明确知道了要跳过的 元素的个数的话,那么可以使⽤ itertools.islice() 来代替。⽐如: from itertools import islice items = [a, b, c, 1, 4, 10, 15] for x in islice(items, 3, None): ... print(x) ... 1 4 10 15 在这个例⼦中,islice() 函数最后那个 None 参数指定了你要获取从第3个到最后 的所有元素,如果 None 和3的位置对调,意思就是仅仅获取前三个元素恰恰相反, (这个跟切⽚的相反操作 [3:] 和 [:3] 原理是⼀样的) 。 讨论 函数 dropwhile() 和 islice() 其实就是两个帮助函数,为的就是避免写出下⾯ 这种冗余代码: with open(/etc/passwd) as f: # Skip over initial comments while True: line = next(f, ) if not line.startswith(#): break # Process remaining lines while line: # Replace with useful processing print(line, end=) line = next(f, None) 跳过⼀个可迭代对象的开始部分跟通常的过滤是不同的。⽐如,上述代码的第⼀个部 分可能会这样重写: with open(/etc/passwd) as f: lines = (line for line in f if not line.startswith(#)) for line in lines: print(line, end=) 这样写确实可以跳过开始部分的注释⾏,但是同样也会跳过⽂件中其他所有的注释 ⾏。换句话讲,我们的解决⽅案是仅仅跳过开始部分满⾜测试条件的⾏,在那以后, 所有的元素不再进⾏测试和过滤了。 最后需要着重强调的⼀点是,本节的⽅案适⽤于所有可迭代对象,包括那些事先不能 确定⼤⼩的,⽐如⽣成器,⽂件及其类

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档