1.迭代是什么?
首先看三个例子:
当迭代的对象是一个list对象的时候,他打印的是每个list对象
python
for i in [1,2,3,4]: print(i) 打印的结果: 1 2 3 4
当咱们迭代的对象是一个字符串的时候,他会一一打印出字符串的每个字符
函数
for c in 'Python': print(c) 打印的结果是: P y t h o n
当咱们迭代的对象是一个字典(dict)时,他会遍历他的keys
oop
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须要迭代对象并返回一个迭代器
code
x=iter([1,2,3]) print(next(x)) print(next(x)) print(next(x)) 结果是: <list_iterator object at 0x0000000001EA2908> 1 2 3 File "D:\Python\xode\try.py", line 6, in <module> 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长度的子序列的元素输入迭代器,组合的字典排序顺序发出,
因此若是输入迭代器进行排序,结合会产生元组排序,每一个元素都是基于他们位置的独特元素,并非按照他们的价值
因此若是输入元素是独一无二的,每一个组合中都没有重复的值
例子:
ci
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的复制迭代器。
学习Python中,大二学生,感兴趣的能够交朋友。qq:904727147