作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

在循环对象和函数对象中,我们了解了循环器(iterator)的功能。循环器是对象的容器,包含有多个对象。通过调用循环器的next()方法 (__next__()方法,在Python 3.x中),循环器将依次返回一个对象。直到所有的对象遍历穷尽,循环器将举出StopIteration错误。

在for i in iterator结构中,循环器每次返回的对象将赋予给i,直到循环结束。使用iter()内置函数,我们可以将诸如表、字典等容器变为循环器。比如

for i in iter([2, 4, 5, 6]):print(i)

标准库中的itertools包提供了更加灵活的生成循环器的工具。这些工具的输入大都是已有的循环器。另一方面,这些工具完全可以自行使用Python实现,该包只是提供了一种比较标准、高效的实现方式。这也符合Python“只有且最好只有解决方案”的理念。

#import the tools

from itertools import *

无穷循环器

count(5, 2)     #从5开始的整数循环器,每次增加2,即5, 7, 9, 11, 13, 15 ...

cycle('abc')    #重复序列的元素,既a, b, c, a, b, c ...

repeat(1.2)    #重复1.2,构成无穷循环器,即1.2, 1.2, 1.2, ...

repeat也可以有一个次数限制:

repeat(10, 5)  #重复10,共重复5次

函数式工具

函数式编程是将函数本身作为处理对象的编程范式。在Python中,函数也是对象,因此可以轻松的进行一些函数式的处理,比如map(), filter(), reduce()函数。

itertools包含类似的工具。这些函数接收函数作为参数,并将结果返回为一个循环器。

比如

from itertools import *rlt= imap(pow, [1, 2, 3], [1, 2, 3])for num inrlt:print(num)

上面显示了imap函数。该函数与map()函数功能相似,只不过返回的不是序列,而是一个循环器。包含元素1, 4, 27,即1**1, 2**2, 3**3的结果。函数pow(内置的乘方函数)作为第一个参数。pow()依次作用于后面两个列表的每个元素,并收集函数结果,组成返回的循环器。

此外,还可以用下面的函数:

starmap(pow, [(1, 1), (2, 2), (3, 3)])

pow将依次作用于表的每个tuple。

ifilter函数与filter()函数类似,只是返回的是一个循环器。

ifilter(lambda x: x > 5, [2, 3, 5, 6, 7]

将lambda函数依次作用于每个元素,如果函数返回True,则收集原来的元素。6, 7

此外,

ifilterfalse(lambda x: x > 5, [2, 3, 5, 6, 7])

与上面类似,但收集返回False的元素。2, 3, 5

takewhile(lambda x: x < 5, [1, 3, 6, 7, 1])

当函数返回True时,收集元素到循环器。一旦函数返回False,则停止。1, 3

dropwhile(lambda x: x < 5, [1, 3, 6, 7, 1])

当函数返回False时,跳过元素。一旦函数返回True,则开始收集剩下的所有元素到循环器。6, 7, 1

组合工具

我们可以通过组合原有循环器,来获得新的循环器。

chain([1, 2, 3], [4, 5, 7])     # 连接两个循环器成为一个。1, 2, 3, 4, 5, 7

product('abc', [1, 2])   # 多个循环器集合的笛卡尔积。相当于嵌套循环

for m, n in product('abc', [1, 2]):print m, n

permutations('abc', 2)   # 从'abcd'中挑选两个元素,比如ab, bc, ... 将所有结果排序,返回为新的循环器。

注意,上面的组合分顺序,即ab, ba都返回。

combinations('abc', 2)   # 从'abcd'中挑选两个元素,比如ab, bc, ... 将所有结果排序,返回为新的循环器。

注意,上面的组合不分顺序,即ab, ba的话,只返回一个ab。

combinations_with_replacement('abc', 2) # 与上面类似,但允许两次选出的元素重复。即多了aa, bb, cc

groupby()

将key函数作用于原循环器的各个元素。根据key函数结果,将拥有相同函数结果的元素分到一个新的循环器。每个新的循环器以函数返回结果为标签。

这就好像一群人的身高作为循环器。我们可以使用这样一个key函数: 如果身高大于180,返回"tall";如果身高底于160,返回"short";中间的返回"middle"。最终,所有身高将分为三个循环器,即"tall", "short", "middle"。

defheight_class(h):if h > 180:return "tall"

elif h < 160:return "short"

else:return "middle"friends= [191, 158, 159, 165, 170, 177, 181, 182, 190]

friends= sorted(friends, key =height_class)for m, n in groupby(friends, key =height_class):print(m)

print(list(n))

注意,groupby的功能类似于UNIX中的uniq命令。分组之前需要使用sorted()对原循环器的元素,根据key函数进行排序,让同组元素先在位置上靠拢。

其它工具

compress('ABCD', [1, 1, 1, 0])  # 根据[1, 1, 1, 0]的真假值情况,选择第一个参数'ABCD'中的元素。A, B, C

islice()                    # 类似于slice()函数,只是返回的是一个循环器

izip()                        # 类似于zip()函数,只是返回的是一个循环器。

总结

itertools的工具都可以自行实现。itertools只是提供了更加成形的解决方案。

python itertools_Python标准库13 循环器 (itertools)相关推荐

  1. Python标准库13 循环器 (itertools)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在循环对象和函数对象中,我们了解了循环器(iterator)的功能.循环器是对象的 ...

  2. python 常用标准库

    python 常用标准库 1.文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata:Unicode字符数据库 st ...

  3. Python使用标准库zipfile+re提取docx文档中超链接文本和链接地址

    推荐教材: <Python程序设计实用教程>,ISBN:978-7-5635-6065-3,董付国,北京邮电大学出版社 教材封面: 全国各地新华书店有售 京东购买链接: 配套资源:教学大纲 ...

  4. Python常用标准库之正则表达式

    Python常用标准库之正则表达式 1.re模块常用函数 1.1 匹配对象以及group()和groups()方法 1.2 match()与search():匹配单个目标 1.3 findall(): ...

  5. python 的标准库模块glob使用教程,主要为glob.glob()使用与glob.iglob()使用

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 python 的标准库模块glob使用教程,主要为glob.glob函数使用与glob.iglob函数使用 文章目录: ...

  6. python 使用标准库连接linux实现scp和执行命令

    import stat import pexpect 只显示关键代码: sqldb = localpath+database //获取database名字 if os.path.exists(sqld ...

  7. CSDN21天学习挑战赛——Python常用标准库概述

    ​活动地址:CSDN21天学习挑战赛 Python有一套标准库,随着python一起安装在电脑中,是python的一个组成部分. 一.os操作系统库 os模块提供了很多与操作系统相关联的函数. 在导入 ...

  8. python之标准库html

    python之标准库html html库是用于解析HTML的一个工具,是python自带的标准库之一. html库位置: __init__.py文件提供两个函数: __all__ = ['escape ...

  9. python常用标准库的基本用法_Python常用标准库之fileinput

    Python常用标准库之fileinput fileinput模块用于对标准输入或多个文件进行逐行遍历.这个模块的使用非常简单,相比open()方法批量处理文件,fileinput模块可以对文件.行号 ...

最新文章

  1. 学会这21条,你离Vim大神就不远了
  2. 深度学习崛起十年:“开挂”的OpenAI革新者
  3. spring in action 7.1 小结
  4. 错过618?暑假阅读季不要错过啦!
  5. 文巾解题 45. 跳跃游戏 II
  6. 下载:Visual Studio 2012 RC候选版
  7. windows ssh远程登录阿里云遇到permissions are too open的错误
  8. LeetCode 1249. 移除无效的括号(栈+set / deque)
  9. 腾讯和阿里巴巴考虑互相开放生态,是真开放还是新的垄断?
  10. Python traceback模块的使用(抛异常、报错、输出错误)
  11. 2016年12月20日感想
  12. vb html ie弹出窗口,VB6 统制IE弹出模式窗口
  13. atitit.网络文件访问协议.unc smb nfs ftp http的区别
  14. mysql gtid dump_MySQL之mysqldump备份的--set-gtid-purged参数
  15. mysql创建视图步骤_MySQL创建视图的详细步骤
  16. 防saq注入_盛大在线另一分站某SQL注入
  17. 【生活】Java程序员的心理抗争(一)
  18. 全能修图工具Pixelmator Pro Mac
  19. Python3 装饰器进行log日志输出
  20. matlab函数——meshgrid、mesh、surf函数

热门文章

  1. A 股分笔交易数据 API 数据接口
  2. 优秀的GPS定位系统源码对开发者意味着什么
  3. 一个称得上“软件智能”的系统怎样才能落地--暨aaas设计纲要
  4. 新鲜面经——腾讯金融类后台开发
  5. c语言Null详解,c语言NULL和0区别及NULL详解(示例代码)
  6. 如何系统的学习Java?
  7. 传感器数据采样率控制
  8. 全志T7平台上移植WiFi RTL8188EUS
  9. (函数题)4-12 判断奇偶性
  10. Gradle安装和使用maven仓库配置