Python Iteration,itertools(Python迭代器,itertool个人总结)

1.迭代是什么?
首先看三个例子:

当迭代的对象是一个list对象的时候,他打印的是每一个list对象

1for i in [1,2,3,4]: 2    print(i) 3打印的结果: 41 52 63 74

当我们迭代的对象是一个字符串的时候,他会一一打印出字符串的每一个字符

1for c in 'Python': 2    print(c) 3打印的结果是: 4P 5y 6t 7h 8o 9n

当我们迭代的对象是一个字典(dict)时,他会遍历他的keys

1for k in {'x':1,'y':2}: 2    print(k) 3打印的结果是: 4x 5y 6add1:(有时候我们会发现打印的结果会是: 7y 8x

为什么呢?
dict的存储不是按照list的方式顺序排列的,所以迭代出的结果顺序很可能不是一样的)

add2:(看到这也许会有同学问,我是否可以用迭代遍历dict的value呢?
答案是肯定的,毕竟这么强大的python,具体怎么做?look at me:

1for value in {'x':1,'y':2}.values(): 2    print(value) 3    打印的结果是: 4    1 5    2 6    或者是 7    ? 8    ?

    我想看了上面的你应该这两个问号怎么填了吧。如果还是不会填这两个问号,我劝你还是回去重新看一下这个文最

    but,等等,等等,有的同学说,我还想把key和value一起遍历。可以吗?

1for k,in {'x':1,'y':2}.items(): 2    print(k,v) 3    打印的结果是: 4    x 1 5    y 2 6    或者是: 7    y 2 8    x 1

    那么问题来了,会不会出现,key和value不匹配呢?经过我运行了成千上百次是不会的。
    为什么呢?自己思考吧。
    )

所以,可以看出的可以迭代的对象很多,list,string,tuple,dict。。。都可以作为迭代的对象

现在知道了迭代器的意思了吗?
迭代器是访问集合内元素的一种方式,迭代对象访问集合的所有元素

2.迭代器的产生
python内置函数ITER需要迭代对象并返回一个迭代器

1x=iter([1,2,3]) 2print(next(x)) 3print(next(x)) 4print(next(x)) 5结果是: 6<list_iterator object at 0x0000000001EA2908> 71 82 93 10File "D:\Python\xode\try.py", line 6, in <module> 11    print(next(x)) 12StopIteration

每一次调用next会访问下一个元素
当元素遍历完如果继续调用next,Python遇到这样的情况时将会抛出StopIteration异常

3.Itertools
Python内置了一个模块itertools,包含了很多函数用于creating iterators for efficient looping(创建更有效率的循环迭代器)

3.1
itertools.accumulate(iterable[, func])
返回累计的和,参数可以是任何类型,包括小数或者分数的增加,
如果提供了可选的功能参数,它应该是两个参数的函数,它将替代加法
简而言之就是:
如果一个list对象是list=[p0,p1,p2,p3,p4],那么通过itertools.accumulate()
返回的结果就是[p0,p0+p1,p0+p1+p2,p0+p1+p2+p3,p0+p1+p2+p3+p4]
例子:必须要导入itertools包

1import itertools 2d=[6,21,5,3,4,8,62,54,12,0] 3de=iter(d) 4print(list(itertools.accumulate(de))) 5打印的结果是: 6[6, 27, 32, 35, 39, 47, 109, 163, 175, 175]

3.2
itertools.chain(*iterables)
使返回元素从第一个直到筋疲力尽的迭代器,然后继续下一个,直到所有的可迭代对象枯竭。用于连续序列作为一个单一序列

实例:

1import itertools 2partlist1='ABC' 3partlist2='DEF' 4partlist3='GHI' 5print(list(itertools.chain(partlist1,partlist2,partlist3))) 6打印的结果是: 7['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']

itertools.chain就是把所有的list连接起来

3.3
itertools.combinations(iterable, r)
返回r长度的子序列的元素输入迭代器,组合的字典排序顺序发出,
所以如果输入迭代器进行排序,结合会产生元组排序,每个元素都是基于他们位置的独特元素,并不是按照他们的价值
所以如果输入元素是独一无二的,每个组合中都没有重复的值
例子:

1import itertools 2partlist1='1234' 3print(list(itertools.combinations(partlist1,2))) 4打印的结果是: 5[('1', '2'), ('1', '3'), ('1', '4'), ('2', '3'), ('2', '4'), ('3', '4')]

通过结果可以看出,itertools.combinations(iterable,r)的函数作用是返回各个r长度的元素,而结果元素是有
原来的list中的元素组合而成,组合的规律是原list中每个元素与其后的元素组合。

同时看一下这个函数combinations_with_replacement('ABCD', 2)
如果把上式的combinations换成combinations_with_replacement那么
打印的结果是:

[('1', '1'), ('1', '2'), ('1', '3'), ('1', '4'), ('2', '2'), ('2', '3'), ('2', '4'), ('3', '3'), ('3', '4'), ('4', '4')]

显然combinations_with_replacement()组合的起始位置是每一个元素自己

3.4
itertools.compress(data, selectors)
通过选择器selectors对data进行筛选,随后只返回那先经过selectors判断为true的data
实例:

1import itertools 2partlist1='1234' 3print(list(itertools.compress(partlist1,[1,1,1,0]))) 4结果是: 5['1', '2', '3']

3.5
itertools.count(start, step)
从start开始,以后每个元素都加上step。step默认值为1。

count(10) --> 10 11 12 13 14 ...

建议大家千万别用这个函数来测试,别问我为什么,我已经重启了五次了。

3.6
itertools.cycle(iterable)
迭代至序列p的最后一个元素后,从p的第一个元素重新开始。 无限迭代
和3.5的建议一样,都是无限迭代

3.7
itertools.repeat(object[, times])
来看看第三个无限迭代的函数,将objext重复times次然后停止
实例:

1import itertools 2partlist1='1234' 3print(list(itertools.repeat(partlist1,2))) 4运行结果是: 5['1234', '1234']

3.8
itertools.dropwhile(predicate, iterable)/itertools.takewhile(predicate, iterable)
从函数的名字就可以知道,predicate是判断条件,当predicate是true的时候迭代器中的参数都扔掉,一直到
predicate是false的时候,输出余下的所有内容(不在判断余下的参数)
实例:

1import itertools 2partlist1=[1,2,3,4,8,1] 3print(list(itertools.dropwhile(lambda x:x<3,partlist1))) 4结果是: 5[3, 4, 8, 1]

很明显,前面的1,2都是符合x<3的,所以都被过滤掉,当参数走到3的时候,因为3不小于3,因此
函数停止,后面的参数不再判断。

3.9
itertools.filterfalse(predicate, iterable)
输出predicate为false的所有数据
一个实例:

1import itertools 2partlist1=[1,2,3,4,8,1] 3print(list(itertools.filterfalse(lambda x:x<3,partlist1))) 4输出结果是: 5[3, 4, 8]

3.10
itertools.islice(iterable, start, stop[, step])
这个函数就是一个切片,我前面的博客介绍过,iterable就是要截取的对象,start开始位置
sop结束位置,最后一个为可选参数,step步长。
实例:

1import itertools 2partlist1=[1,2,3,4,8,1] 3print(list(itertools.islice(partlist1,2,None))) 4结果是: 5[3, 4, 8, 1]

3.11

1itertools.startmap(function,iterable) 2将iterable中的参数,经过function处理,一一返回。 3import itertools 4print(list(itertools.starmap(pow,[(2,3),(3,2)]))) 5打印的结果是: 6[8, 9]

3.12
itertools.tee(it,n)
返回n个迭代器it的复制迭代器。

学习Python中,大二学生,感兴趣的可以交朋友。qq:904727147

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )