今天我们依然介绍的是迭代器,不过介绍的是几个比较常用的 高级用法 ,在实际场景当中非常实用,可以帮助我们大大简化代码的复杂度。

跳过开头

首先是跳过开始部分,这个在我们读取文本的时候最常用。在实际的应用当中,比如记录的日志或者是代码等等,一般来说 头部都会附上一段说明 ,或者用注释标注或者是用特殊的符号标记。这些信息是给用到数据的程序员看的,当我们通过代码获取数据的时候,显然是希望可以过滤掉这些信息的。

比如我们有一段数据,它的开头用#做了一些注释:

# This is a data for student
# Rows 100xiaoming, 17, 99;
xiaoli, 18, 98;
...

常规操作当中,我们会创建一个打开文件的迭代器,我们通过遍历这个迭代器去获取文件当中的数据:

with open('xxxx.txt') as f:for line in f:print(line)

如果只是用来输出还好,如果我们需要加工文件当中的数据,那么头部的注释信息就会干扰我们代码的运行。我们当然可以手动加入一些判断,但是这会比较麻烦,代码也不够美观。针对这个问题,一个比较好的解决方案是 dropwhile 。

dropwhile是itemtools当中的一个函数,它可以 接收一个我们自定义的过滤函数和迭代器重新生成一个新的迭代器 ,这个新的迭代器当中会过滤掉之前迭代器头部不符合我们要求的数据:

在刚才的例子当中我们想要过滤掉头部加了#注释的部分,我们可以这么操作:

from itertools import dropwhile
with open('xxxx.txt') as f:for line in dropwhile(lambda line: line.startswith('#'), f):print(line)

这样出来的结果就没有头部我们不需要的内容了。

当我们知道头部不符合情况的数据的格式的时候,可以使用dropwhile来规定过滤的格式。如果我们 知道需要过滤的条数 ,则可以使用另外一个工具,叫做islice,它的本质是一个切片函数,就像是Python当中数组的切片功能一样,可以切出迭代器当中指定片段的数据。

举个例子:

from itertools import dropwhile
with open('xxxx.txt') as f:for line in islice(f, 3, None):print(line)

这样我们就会从第三行开始获取,之前的数据会被过滤掉。它其实就代表着数组当中[3: ]的切片操作。

迭代排列组合

我们都知道在C++当中有一个叫做next_permutation的函数,可以传入一个数组,返回下一个字典序的排列。在Python当中也有同样的功能,但是是以迭代器的形式使用的。

举个简单的例子,比如我们有a, b, c三个元素,我们希望求出它的所有排列:

items = ['a', 'b', 'c']
from itertools import permutationsfor p in permutations(items):print(p)

permutations还支持多传一个参数,比如上述的排列当中我们希望只保留前两个元素,除了切片之外,我们只需要多传一个参数就好了,like this:

for p in permutations(items, 2):print(p)

除了排列之外,itertools当中还支持组合,用法还是一样,只是把函数名称换成是combinations而已:

from itertools import combindations
for c in combinations(items):print(c)

在一般的组合当中,一个元素一旦被选中那么它接下来就会从候选集当中移除,再也不会被选中。如果我们希望获得有放回的组合,我们可以再换一个函数,这个函数名称有点长,但是名字倒也直观叫做combinations_with_replacement。但既然是有放回的抽样,我们 需要设定元素的数量 ,否则抽样可以无限进行下去。

for c in combinations_with_replacement(items, 3):print(c)

迭代合并后的序列

上一篇文章当中我们介绍了zip可以同时迭代多个迭代器,除此之外还有一种情况是我们需要 把多个迭代器串起来迭代 。比如系统的日志打在了多个文件当中,我们希望找出其中有error的日志来分析。这个时候,我们希望的不是同时读取多个迭代器,而是希望能够有办法将多个迭代器的内容串联起来。这个功能就是itertools当中的 chain 方法,它接受多个迭代器,当我们遍历的时候,会自动将多个迭代器的内容串联起来,我们可以无缝迭代。

举个例子:

from itertools import chain
nums = [1, 2, 3]
chars = ['a', 'b', 'c']for i in chain(nums, chars):print(i)

这样我们会把nums和chars当中的内容一起输出出来, 就好像从头到尾只执行了一个迭代器一样 。

你可能会说我们不用chain也可以实现啊,我们可以这样:

for i in nums + chars:print(i)

的确,从结果上来看这样也是行得通的。但是如果我们分析一下内部执行的时候的中间变量,会发现当我们执行nums+chars的时候,实际上是 先创建了一个新的临时list 。然后在这个list当中存储nums和chars的数据,也就是说我们迭代的其实是这个新的list。这带来的结果是我们 额外开辟了一段内存 ,并且花费了一些时间。如果我们使用chain,它并不会有这样的中间变量,完全是通过迭代器来执行的迭代,非常节省内存,这也是chain的优点。

归并迭代的内容

对于归并操作我们应该都不陌生,在之前的归并排序以及一些题解的文章当中我们见过很多次。同样,我们在使用工具合并多个迭代器内容的时候,如果迭代器当中的内容有序,我们也可以 对多个迭代器当中的元素进行归并 ,而不再需要我们自己手动操作。

使用我们之前介绍的heapq的库可以非常轻松地做到这一点,我们一起来看一个例子:

a = [1, 3, 5]
b = [2, 4, 6]import heapqfor c in heapq.merge(a, b):print(c)

执行之后,我们会得到[1, 2, 3, 4, 5, 6]的结果。也就是说通过heapq.merge操作,我们把多个有序的迭代器合并到了一起。当然我们也可以自己合并,但如果我们只是需要利用当中的数据的话,使用merge操作可以节省内存空间。

到这里内容就结束了,本文和之前的文章基本上列举完了常用的迭代器用法。当然,除了上述讲到的内容之外,Python当中的迭代器还有一些其他的用法,不过相对不太常用

Python——迭代器的几个高级用法相关推荐

  1. Python爬虫1.4 — requests高级用法教程

    Python爬虫1.4 - requests高级用法教程 综述 设置请求头(headers) 设置代理服务器IP(proxy) Cookies(Session) requests.Session() ...

  2. Python爬虫4.4 — selenium高级用法教程

    Python爬虫4.4 - selenium高级用法教程 综述 Headless Chrome 设置请求头 设置代理IP 常用启动项参数options设置 Cookie操作 selenium设置coo ...

  3. Python内置函数max()高级用法

    不管是排序还是选取最大值或者最小值,都应该有个规则或者顺序,而平时我们所说的最大值或最小值实际上也是在某种排序规则或顺序下的最大值和最小值.Python内置函数max().min()和sorted() ...

  4. Python 内建函数 max/min的高级用法

    max/min 函数 Python 中的 max/min函数是用来获取传入参数的最大值或最小值的,其运行机制都一样,所以这里主要描述 max 的运行机制以及使用方法. 最简单的用法,就是直接传入两个要 ...

  5. Python中sorted()函数的高级用法详解

    sorted()函数的作用是对对象进行排序 函数函数格式: sorted(iterable,key,reverse),key参数可传入一个自定义函数 下边通过具体例子说明sorted的具体用法: 一维 ...

  6. Python内置函数int()高级用法

    int()函数常用来把其他类型转换为整数,例如: >>> int(3.2) 3 >>> int(1/3) 0 其实,int是Python内置类型之一,之所以能够当作 ...

  7. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  8. Python requests模块高级用法

    2019独角兽企业重金招聘Python工程师标准>>> 快速入门的话可以参考这篇文章,但是进阶的话还是建议参考官方的文档,毕竟官方的文档更新比较及时,也有些高级用法,猛戳这里! 会话 ...

  9. Python多线程多进程、异步、异常处理等高级用法

    文章目录 前言 多线程多进程 多线程 多进程 协程 总结 异步 基本概念 异步编程 asyncio aiohttp 异常 常见异常 异常处理 自定义异常 lambda表达式 lambda表达式用法 高 ...

最新文章

  1. java设计模式:适配器设计模式
  2. @ 在 C# string 中的用法
  3. [html] 如何使用H5唤起原生地图APP(百度、高德、腾讯地图等)
  4. 【Oracle】开、关、删归档日志(archivelog)
  5. 使用计数器、译码器,在数码管上显示1~4
  6. ubuntu1604 克隆虚拟机后续:修改用户名、主机名和组名
  7. php 分针和时针重合,分针和时针每天重合多少次?
  8. cad填充密度怎么调整_CAD填充比例调好了,填充物数量怎么调,就是密度怎么调?...
  9. python debug配置launch.json例子
  10. win10删除工作组计算机,win10工作组怎么退出-退出win10工作组的教程 - 河东软件园...
  11. 2018妙计旅行笔试题
  12. 保研/面试复习-数据结构与算法-万字总结(近三万字)
  13. 网易考拉海购软件测试岗怎么样,【网易考拉海购运营专员面试】面官态度倨傲,社区理念不明,995工作,很不推荐-看准网...
  14. 运用CS-LBP提取裂纹的梯度特征
  15. 搭建短视频被动收益系统的资源网站,实现月入过万
  16. VS2019生成Steup文件在其他处理器运行
  17. npm ERR! code EPERMnpm ERR! syscall opennpm ERR! npm ERR! errno -4048
  18. php版本升级会卡吗,升级php版本到php5.5,掉坑了。。。。
  19. 对SVM的个人理解---浅显易懂
  20. No route to host : connet

热门文章

  1. zabbix监控MHA及自动启动
  2. 移动端页面按手机屏幕分辨率自动缩放的js
  3. 修改数据库端口为51433
  4. JQuery如何与数据库交互
  5. 学习hashtable,处理“海量”数据
  6. 利用ISA2006发布Exchange的RPC over HTTPS
  7. Docker-Compose快速部署开源网盘系统Tank蓝眼网盘系统
  8. Web前端开发面试考点指南
  9. CentOS上安装Jekins
  10. typora+picgo+gitee搭建免费图床纵享丝滑