首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python Iteration,itertools(Python迭代器,itertool个人总结)

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

作者头像
用户7886150
修改2020-11-30 18:04:17
修改2020-11-30 18:04:17
6080
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: 有效地在Python中使用迭代

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

当迭代的对象是一个list对象的时候,他打印的是每一个list对象  for i in [1,2,3,4]:  pritn(i)  打印的结果:  1  2  3  4 

当我们迭代的对象是一个字符串的时候,他会一一打印出字符串的每一个字符  for c in ‘Python’:  print(c)  打印的结果是:  P  y  t  h  o  n 

当我们迭代的对象是一个字典(dict)时,他会遍历他的keys  for k in {‘x’:1,’y’:2}:  print(k)  打印的结果是:  x  y 

add1:(有时候我们会发现打印的结果会是:  y  x  为什么呢?  dict的存储不是按照list的方式顺序排列的,所以迭代出的结果顺序很可能不是一样的) 

add2:(看到这也许会有同学问,我是否可以用迭代遍历dict的value呢?  答案是肯定的,毕竟这么强大的python,具体怎么做?look at me:  for value in {‘x’:1,’y’:2}.values():  print(value)  打印的结果是:  1  2  或者是  ?  ?  我想看了上面的你应该这两个问号怎么填了吧。如果还是不会填这两个问号,我劝你还是回去重新看一下这个文最 

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

for k,v in {‘x’:1,’y’:2}.items():  print(k,v)  打印的结果是:  x 1  y 2  或者是:  y 2  x 1  那么问题来了,会不会出现,key和value不匹配呢?经过我运行了成千上百次是不会的。  为什么呢?自己思考吧。  ) 

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

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

2.迭代器的产生  python内置函数ITER需要迭代对象并返回一个迭代器  x=iter([1,2,3])  print(next(x))  print(next(x))  print(next(x))  结果是:   1  2  3  File “D:\Python\xode\try.py”, line 6, in  print(next(x))  StopIteration  每一次调用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包  import itertools  d=[6,21,5,3,4,8,62,54,12,0]  de=iter(d)  print(list(itertools.accumulate(de)))  打印的结果是:  [6, 27, 32, 35, 39, 47, 109, 163, 175, 175] 

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

实例:  import itertools  partlist1=’ABC’  partlist2=’DEF’  partlist3=’GHI’  print(list(itertools.chain(partlist1,partlist2,partlist3)))  打印的结果是:  [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’]  itertools.chain就是把所有的list连接起来 

3.3  itertools.combinations(iterable, r)  返回r长度的子序列的元素输入迭代器,组合的字典排序顺序发出,  所以如果输入迭代器进行排序,结合会产生元组排序,每个元素都是基于他们位置的独特元素,并不是按照他们的价值  所以如果输入元素是独一无二的,每个组合中都没有重复的值  例子:  import itertools  partlist1=’1234’  print(list(itertools.combinations(partlist1,2)))  打印的结果是:  [(‘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  实例:  import itertools  partlist1=’1234’  print(list(itertools.compress(partlist1,[1,1,1,0])))  结果是:  [‘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次然后停止  实例:  import itertools  partlist1=’1234’  print(list(itertools.repeat(partlist1,2)))  运行结果是:  [‘1234’, ‘1234’] 

3.8  itertools.dropwhile(predicate, iterable)/itertools.takewhile(predicate, iterable)  从函数的名字就可以知道,predicate是判断条件,当predicate是true的时候迭代器中的参数都扔掉,一直到  predicate是false的时候,输出余下的所有内容(不在判断余下的参数)  实例:  import itertools  partlist1=[1,2,3,4,8,1]  print(list(itertools.dropwhile(lambda x:x<3,partlist1)))  结果是:  [3, 4, 8, 1]  很明显,前面的1,2都是符合x<3的,所以都被过滤掉,当参数走到3的时候,因为3不小于3,因此  函数停止,后面的参数不再判断。 

3.9  itertools.filterfalse(predicate, iterable)  输出predicate为false的所有数据  一个实例:  import itertools  partlist1=[1,2,3,4,8,1]  print(list(itertools.filterfalse(lambda x:x<3,partlist1)))  输出结果是:  [3, 4, 8] 

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

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

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

钟志远 江苏南京 904727147

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档