一、无限迭代器

1、itertools.count(start=0, step=1)

创建一个迭代器,返回一个以start开头,以step间隔的值。其大体如下:

def count(start=0, step=1):#count(10) --> 10 11 12 13 14 ...

#count(2.5, 0.5) -> 2.5 3.0 3.5 ...

n =startwhileTrue:yieldn

n+= step

其实咧为:

from itertools importcountimporttimefor i in count(10):

time.sleep(2)print(i) #10、11、12...

其中count(10)的类型为itertools.count类型,通过被用作map或者zip函数的参数。

比如:

#map使用

map(lambda x:x*2,count(5))#zip使用

a = zip(count(10),'xy')print(list(a))"""[(10, 'x'), (11, 'y')]"""

2、itertools.cycle(iterable)

创建一个迭代器,从迭代器返回元素,并且保存每个元素的副本。当迭代器迭代完毕后,从保存的副本中返回元素,无限重复。其大体如下:

defcycle(iterable):#cycle('ABCD') --> A B C D A B C D A B C D ...

saved =[]for element initerable:yieldelement

saved.append(element)whilesaved:for element insaved:yield element

实例为:

from itertools importcycleprint(cycle('ABCDE')) #

for item in cycle('ABCDE'):print(item) #A、B、C、D、E、A、B、C、D、E...

3、itertools.repeat(object[, times])

创建一个迭代器,一次又一次的返回对象,除非指定times对象,否则将一直运行下去。其大体如下:

def repeat(object, times=None):#repeat(10, 3) --> 10 10 10

if times isNone:whileTrue:yieldobjectelse:for i inrange(times):yield object

其可用于map和zip函数中:

In [1]: from itertools importrepeat

In [2]: list(map(pow, range(10), repeat(2)))

Out[2]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

In [3]: list(zip(range(5),repeat(10)))

Out[3]: [(0, 10), (1, 10), (2, 10), (3, 10), (4, 10)]

In [4]:

二、 迭代器终止最短输入序列

1、itertools.accumulate(iterable[, func])

创建一个迭代器,返回累加的总和或者是其它指定函数的累加结果(通过func函数进行指定),如果提供了func,则它应该是iterable输入的元素。如果输入的iterable为空,则输出的iterable也将为空。其大体如下:

def accumulate(iterable, func=operator.add):'Return running totals'

#accumulate([1,2,3,4,5]) --> 1 3 6 10 15

#accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120

it =iter(iterable)try:

total=next(it)exceptStopIteration:return

yieldtotalfor element init:

total=func(total, element)yield total

其实例为:

from itertools importaccumulateprint(accumulate([1,2,3])) #

print(list(accumulate([1,2,3]))) #[1, 3, 6]

print(list(accumulate([1,2,3],lambda x,y:x*y))) #[1, 2, 6]

2、itertools.chain(*iterables)

创建一个迭代器,该迭代器从第一个可迭代对象返回元素,直到耗尽为止,然后继续进行下一个可迭代对象,直到所有可迭代对象都耗尽为止。用于将连续序列视为单个序列。大致相当于:

def chain(*iterables):#chain('ABC', 'DEF') --> A B C D E F

for it initerables:for element init:yield element

其实例为:

from itertools importchainprint(list(chain([1,2,3],[5,6,7]))) #[1, 2, 3, 5, 6, 7]

3、classmethod chain.from_iterable(iterable)

chain函数的替代构造函数,从一个单独的可迭代的参数获取连续的输入,大致相当于:

deffrom_iterable(iterables):#chain.from_iterable(['ABC', 'DEF']) --> A B C D E F

for it initerables:for element init:yield element

其实例为:

from itertools importchainprint(list(chain.from_iterable([[1,2,3],[5,6,7]]))) #[1, 2, 3, 5, 6, 7]

4、itertools.compress(data, selectors)

创造一个迭代器,用于从数据中过滤元素,这些元素是选择器中对应的元素的结果为True。当数据或者选择器中的元素迭代完毕后停止,其大体相当于:

defcompress(data, selectors):#compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F

return (d for d, s in zip(data, selectors) if s)

其实例为:

from itertools importcompress

data= [1, 2, 3, 4]

selectors= [1, 0, 1, 0]

filter_data=compress(data, selectors)print(filter_data) #

print(list(filter_data)) #[1, 3]

5、itertools.dropwhile(predicate, iterable)

创建一个迭代器,只要predicate为真就从iterable中删除对应的元素,然后返回iterable中剩余的元素。注意的是只要predicate为False,迭代器就不会产生任何元素了,其大体相当于:

defdropwhile(predicate, iterable):#dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1

iterable =iter(iterable)for x initerable:if notpredicate(x):yieldxbreak

for x initerable:yield x

其实例为:

from itertools importdropwhile

data= [1, 2, 3, 4, 5]

result= dropwhile(lambda x: x < 3, data)print(result) #

print(list(result)) #[3, 4, 5]

6、itertools.filterfalse(predicate, iterable)

创建一个迭代器,过滤出那些当predicate为False时对应的iterable中的元素,如果predicate为None,则返回这个对应的元素。其大体相当于:

deffilterfalse(predicate, iterable):#filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8

if predicate isNone:

predicate=boolfor x initerable:if notpredicate(x):yield x

其实例为:

from itertools importfilterfalse

data= [1, 2, 3, 4, 5]

result= filterfalse(lambda x: x % 2, data)print(result) #

print(list(result)) #[2, 4]

7、itertools.groupby(iterable, key=None)

创建一个迭代器,从iterable中返回一系列的key和groups。其中key是一个函数,用于计算从iterable中每一个元素产生的key值。

classgroupby:#[k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B

#[list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

def __init__(self, iterable, key=None):if key isNone:

key= lambdax: x

self.keyfunc=key

self.it=iter(iterable)

self.tgtkey= self.currkey = self.currvalue =object()def __iter__(self):returnselfdef __next__(self):while self.currkey ==self.tgtkey:

self.currvalue= next(self.it) #Exit on StopIteration

self.currkey =self.keyfunc(self.currvalue)

self.tgtkey=self.currkeyreturn(self.currkey, self._grouper(self.tgtkey))def_grouper(self, tgtkey):while self.currkey ==tgtkey:yieldself.currvaluetry:

self.currvalue=next(self.it)exceptStopIteration:returnself.currkey= self.keyfunc(self.currvalue)

8、itertools.islice(iterable, start, stop[, step])

创建一个迭代器,返回从iterable中选择的元素。如果start非零,则iterable中的元素一直被取出直到取出的个数到达start截止;如果stop是None,则直到iterable中的元素耗尽为止,islice方法对于start、stop、step不支持负数。其大致相当于:

def islice(iterable, *args):#islice('ABCDEFG', 2) --> A B

#islice('ABCDEFG', 2, 4) --> C D

#islice('ABCDEFG', 2, None) --> C D E F G

#islice('ABCDEFG', 0, None, 2) --> A C E G

s = slice(*args)

it= iter(range(s.start or 0, s.stop or sys.maxsize, s.step or 1))try:

nexti=next(it)exceptStopIteration:return

for i, element inenumerate(iterable):if i ==nexti:yieldelement

nexti= next(it)

特别的是如果start是None,迭代器是从0开始,如果step是None,默认是从1。

其实例为:

from itertools importislice

data= [1, 2, 3, 4, 5, 6]

result= islice(data, 1, 5)print(result) #

print(list(result)) #[2, 3, 4, 5]

9、itertools.starmap(function, iterable)

创建一个迭代器,从iterable中获取参数来计算函数,map()和starmap()的区别相当于function(a,b)和function(*c),其大体如下:

defstarmap(function, iterable):#starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000

for args initerable:yield function(*args)

10、itertools.takewhile(predicate, iterable)

创建一个迭代器,只要predicate为True,就返回与之对应的iterable中的元素。其大体如下:

deftakewhile(predicate, iterable):#takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4

for x initerable:ifpredicate(x):yieldxelse:break

11、itertools.tee(iterable, n=2)

从一个iterable返回n个独立的迭代器。其大体如下:

def tee(iterable, n=2):

it=iter(iterable)

deques= [collections.deque() for i inrange(n)]defgen(mydeque):whileTrue:if not mydeque: #when the local deque is empty

try:

newval= next(it) #fetch a new value and

exceptStopIteration:return

for d in deques: #load it to all the deques

d.append(newval)yieldmydeque.popleft()return tuple(gen(d) for d in deques)

实例为:

from itertools importtee

result= tee([1,2,3],2)print(result) #(, )

for item inresult:print(list(item)) #[1, 2, 3], [1, 2, 3]

12、itertools.zip_longest(*iterables, fillvalue=None)

创建一个迭代器,以聚合每个iterable中的元素,如果iterable中元素的长度不均匀,则用fillvalue进行填充缺失值,迭代一直持续到最长的iterable耗尽为止。其大体相当于:

classZipExhausted(Exception):pass

def zip_longest(*args, **kwds):#zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-

fillvalue = kwds.get('fillvalue')

counter= len(args) - 1

defsentinel():

nonlocal counterif notcounter:raiseZipExhausted

counter-= 1

yieldfillvalue

fillers=repeat(fillvalue)

iterators= [chain(it, sentinel(), fillers) for it inargs]try:whileiterators:yieldtuple(map(next, iterators))exceptZipExhausted:pass

三、组合迭代器

1、itertools.product(*iterables, repeat=1)

大致等效于生成器中的for循环:

((x,y) for x in A for y in B)

其大体如下:

def product(*args, repeat=1):#product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy

#product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111

pools = [tuple(pool) for pool in args] *repeat

result=[[]]for pool inpools:

result= [x+[y] for x in result for y inpool]for prod inresult:yield tuple(prod)

2、itertools.permutations(iterable, r=None)

def permutations(iterable, r=None):#permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC

#permutations(range(3)) --> 012 021 102 120 201 210

pool =tuple(iterable)

n=len(pool)

r= n if r is None elserif r >n:returnindices=list(range(n))

cycles= list(range(n, n-r, -1))yield tuple(pool[i] for i inindices[:r])whilen:for i inreversed(range(r)):

cycles[i]-= 1

if cycles[i] ==0:

indices[i:]= indices[i+1:] + indices[i:i+1]

cycles[i]= n -ielse:

j=cycles[i]

indices[i], indices[-j] = indices[-j], indices[i]yield tuple(pool[i] for i inindices[:r])break

else:return

permutations也可以用product函数来进行表示,只要排除那些重复的元素即可。

def permutations(iterable, r=None):

pool=tuple(iterable)

n=len(pool)

r= n if r is None elserfor indices in product(range(n), repeat=r):if len(set(indices)) ==r:yield tuple(pool[i] for i in indices)

3、itertools.combinations(iterable, r)

组合按字典顺序排序。因此,如果对输入的iterable进行排序,则将按排序顺序生成组合元组。其大体相当于:

defcombinations(iterable, r):#combinations('ABCD', 2) --> AB AC AD BC BD CD

#combinations(range(4), 3) --> 012 013 023 123

pool =tuple(iterable)

n=len(pool)if r >n:returnindices=list(range(r))yield tuple(pool[i] for i inindices)whileTrue:for i inreversed(range(r)):if indices[i] != i + n -r:break

else:returnindices[i]+= 1

for j in range(i+1, r):

indices[j]= indices[j-1] + 1

yield tuple(pool[i] for i in indices)

4、itertools.combinations_with_replacement(iterable, r)

从输入迭代返回元素的r长度子序列, 允许单个元素重复多次。组合按字典顺序排序。因此,如果对输入的iterable进行排序,则将按排序顺序生成组合元组。其大体如下:

defcombinations_with_replacement(iterable, r):#combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC

pool =tuple(iterable)

n=len(pool)if not n andr:returnindices= [0] *ryield tuple(pool[i] for i inindices)whileTrue:for i inreversed(range(r)):if indices[i] != n - 1:break

else:returnindices[i:]= [indices[i] + 1] * (r -i)yield tuple(pool[i] for i in indices)

python itertools模块位置_Python之itertools模块相关推荐

  1. python写日志文件_Python logging日志模块 配置文件方式

    在一些微服务或web服务中我们难免需要日志功能,用来记录一些用户的登录记录,操作记录,以及一些程序的崩溃定位,执行访问定位等等; Python内置 非常强大的日志模块 ==> logging 今 ...

  2. python url模块介绍_python 中 urlparse 模块介绍

    urlparse模块主要是用于解析url中的参数  对url按照一定格式进行 拆分或拼接 1.urlparse.urlparse 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路 ...

  3. python实现自动按键_Python使用pyautogui模块实现自动化鼠标和键盘操作示例

    本文实例讲述了Python使用pyautogui模块实现自动化鼠标和键盘操作.分享给大家供大家参考,具体如下: 一.pyautogui模块简要说明 ## 使用 pyautogui 模块相关函数,可以模 ...

  4. python处理回显_Python中getpass模块无回显输入源码解析

    本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...

  5. python导入模块快捷键_Python中的模块导入和读取键盘输入的方法

    导入模块 import 语句 想使用Python源文件,只需在另一个源文件里执行import语句,语法如下: ? 当解释器遇到import语句,如果模块在当前的搜索路径就会被导入. 搜索路径是一个解释 ...

  6. python 导入包 作用域_Python 包、模块、函数、变量作用域

    Python 项目的组织结构 - 包 -- 模块 --- 类 ---- 函数.变量 Python是利用包和模块来组织一个项目的. 包: 包的物理表现是一个文件夹,但是一个文件夹却不一定是个包,要想让个 ...

  7. python中common在哪个模块导入_python的常用模块之collections模块详解

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  8. python中sys用法_Python中sys模块功能与用法实例详解

    Python中sys模块功能与用法.,具体如下: sys-系统特定的参数和功能 该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数.它始终可用. sys.argv 传递给Pyth ...

  9. python echo(msg) 字符串_python的subprocess模块

    1 os与commands模块 2 subprocess模块 3 subprocess.Popen类 我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell. ...

最新文章

  1. shiro多realm验证之——shiro实现不同身份使用不同Realm进行验证(转)
  2. Python基础学习!容器:列表,元组,字典与集合!(2)
  3. asp.net mvc 3 RTM 发布了!
  4. Leetcode 剑指 Offer 24. 反转链表 (每日一题 20210823)
  5. RS-485中继器的多种使用方法
  6. python字符串怎么用_零基础如何使用python处理字符串?
  7. 为什么有的人喜欢夜间工作_为什么开发人员喜欢在夜间编码
  8. java笔试题(1)
  9. 双向板课设按照弹性计算_T004 结构专业施工图技术问答结构布置与计算
  10. python是干什么用的-python是做什么用的 python有什么用 - 驱动管家
  11. 技术人真的能做一辈子技术么?
  12. mac上数据库管理工具Navicat Premium 连接mySQL
  13. switch语句的ns图怎么画_ns结构流程图是什么?ns流程图怎么画?
  14. 安信天行全方位信息安全态势感知平台建设与运营
  15. Error: The apk for your currently selected variant (app-release-unsigned.apk) is not signed. Please
  16. 验证的方法篇之七:性能验证
  17. Python 常用标准库介绍
  18. 音视频学习之ffmpeg时间戳相关整理(时间基tbr,tbn,tbc)
  19. c语言教程github,GitHub - saitjr/C-Toturials: C语言教程
  20. docker-compose基本命令使用

热门文章

  1. 手把手教你爬取PC端『某酷视频』个人历史播放数据,并可视化展示
  2. 外挂辅助技术研究-分析选怪功能
  3. 用一个通俗的例子讲清楚API
  4. 五、数据编码:曼侧斯特编码,差分曼彻斯特编码的区别 , 4B/5B编码 ——网络工程师成长之路
  5. “Linux之父”Linus 获颁英特尔首个终身创新成就奖
  6. 如何使用华为软件开发云快速部署PHP网站
  7. ImageRanger Pro Edition for Mac(图片管理工具)
  8. 微信论坛小程序系统设计与实现
  9. 从dhcpd.lease中提取MAC和IP地址
  10. css中的text-shadow的用法