设为首页 收藏本站
查看: 1549|回复: 0

[经验分享] Python标准库13 循环器 (itertools)

[复制链接]

尚未签到

发表于 2015-4-21 06:37:25 | 显示全部楼层 |阅读模式
  作者:Vamei 出处:http://www.iyunv.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 in rlt:
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"。




def height_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快速教程”
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58967-1-1.html 上篇帖子: Python快速教程 (手册) 下篇帖子: 轻松自动化---selenium-webdriver(python) (二)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表