请选择 进入手机版 | 继续访问电脑版

[python] 关于Python中 循环器 itertools的先容

[复制链接]
查看99 | 回复15 | 2021-9-13 10:59:12 | 显示全部楼层 |阅读模式
目次

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

  1. for i in iter([2, 4, 5, 6]):
  2. print(i)
复制代码

标准库中的

  1. itertools
复制代码
包提供了更加机动 的天生 循环器的工具。这些工具的输入大都是已有的循环器。另一方面,这些工具完全可以自利用 用 Python实现,该包只是提供了一种比较标准、高效的实现方式。这也符合Python“只有且最好只有办理 方案”的理念。

  1. # import the tools
  2. from itertools import *
复制代码

1、无穷循环器

    1. count(5, 2)   
    复制代码
      #从5开始的整数循环器,每次增长 2,即5, 7, 9, 11, 13, 15 ...
    1. cycle('abc')  
    复制代码
      #重复序列的元素,既a, b, c, a, b, c ...
    1. repeat(1.2)  
    复制代码
       #重复1.2,构成无穷循环器,即1.2, 1.2, 1.2, ...

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

    1. repeat(10, 5) 
    复制代码
      #重复10,共重复5次

2、函数式工具

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

itertools包含雷同 的工具。这些函数吸取 函数作为参数,并将效果 返回为一个循环器。

比如:

  1. from itertools import *
  2. rlt = imap(pow, [1, 2, 3], [1, 2, 3])
  3. for num in rlt:
  4. print(num)
复制代码

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

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

  1. starmap(pow, [(1, 1), (2, 2), (3, 3)])
复制代码

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

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

  1. ifilter(lambda x: x > 5, [2, 3, 5, 6, 7]
复制代码

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

此外,

  1. ifilterfalse(lambda x: x > 5, [2, 3, 5, 6, 7])
复制代码

与上面雷同 ,但网络 返回False的元素。2, 3, 5

  1. takewhile(lambda x: x < 5, [1, 3, 6, 7, 1])
复制代码

当函数返回True时,网络 元素到循环器。一旦函数返回False,则制止 。1, 3

  1. dropwhile(lambda x: x < 5, [1, 3, 6, 7, 1])
复制代码

当函数返回False时,跳过元素。一旦函数返回True,则开始网络 剩下的全部 元素到循环器。6, 7, 1

3、组合工具

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

    1. chain([1, 2, 3], [4, 5, 7])   
    复制代码
       # 毗连 两个循环器成为一个。1, 2, 3, 4, 5, 7
    1. product('abc', [1, 2])  
    复制代码
    # 多个循环器集合的笛卡尔积。相当 于嵌套循环      
  1. for m, n in product('abc', [1, 2]):
  2. print m, n
复制代码
    1. permutations('abc', 2)  
    复制代码
    # 从'abcd'中挑选两个元素,比如ab, bc, ... 将全部 效果 排序,返回为新的循环器。

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

    1. combinations('abc', 2) 
    复制代码
      # 从'abcd'中挑选两个元素,比如ab, bc, ... 将全部 效果 排序,返回为新的循环器。

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

    1. combinations_with_replacement('abc', 2)
    复制代码
    # 与上面雷同 ,但答应 两次选出的元素重复。即多了aa, bb, cc

4、groupby()

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

这就好像一群人的身高作为循环器。我们可以使用 如许 一个key函数: 假如 身高大于180,返回"tall";假如 身高底于160,返回"short";中心 的返回"middle"。终极 ,全部 身高将分为三个循环器,即"tall", "short", "middle"。

  1. def height_class(h):
  2. if h > 180:
  3. return "tall"
  4. elif h < 160:
  5. return "short"
  6. else:
  7. return "middle"
  8. friends = [191, 158, 159, 165, 170, 177, 181, 182, 190]
  9. friends = sorted(friends, key = height_class)
  10. for m, n in groupby(friends, key = height_class):
  11. print(m)
  12. print(list(n))
复制代码

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

5、别的 工具

    1. compress('ABCD', [1, 1, 1, 0]) 
    复制代码
    # 根据[1, 1, 1, 0]的真假值环境 ,选择第一个参数'ABCD'中的元素。A, B, C
    1. islice()
    复制代码
           # 雷同 于slice()函数,只是返回的是一个循环器
    1. izip() 
    复制代码
                             # 雷同 于zip()函数,只是返回的是一个循环器。

总结:
itertools的工具都可以自行实现。itertools只是提供了更加成形的办理 方案。

到此这篇关于Python 循环器 itertools的文章就先容 到这了,更多干系 Python  itertools内容请搜刮 脚本之家从前 的文章或继续欣赏 下面的干系 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 伤心骑士口 | 2021-9-25 07:59:25 | 显示全部楼层
admin楼主病的不轻啊!
回复

使用道具 举报

avatar 加菲猫419 | 2021-10-3 17:56:40 | 显示全部楼层
读了admin楼主的帖子,顿时马桶就通了。。。
回复

使用道具 举报

avatar dxf17 | 2021-10-3 17:56:43 | 显示全部楼层
admin楼主会死的很有节奏的!
回复

使用道具 举报

楼上长在线啊?
回复

使用道具 举报

avatar 朋友一起走 | 2021-10-4 09:53:19 | 显示全部楼层
楼上的刚出院吧?
回复

使用道具 举报

avatar 顺势而为47 | 2021-10-9 03:52:15 | 显示全部楼层
太高深了,理解力不够用了!
回复

使用道具 举报

avatar 木子李皓 | 2021-10-15 20:08:53 | 显示全部楼层
今天不想骂人!
回复

使用道具 举报

avatar 哲911 | 2021-10-17 19:21:58 | 显示全部楼层
看帖不回帖的人就是耍流氓,我回复了!
回复

使用道具 举报

avatar 鹤翎商贸 | 2021-10-20 07:12:15 | 显示全部楼层
admin楼主就是我的榜样哦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则