1.迭代是什么?
首先看三个例子:
当迭代的对象是一个list对象的时候,他打印的是每一个list对象
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
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))
结果是:
<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长度的子序列的元素输入迭代器,组合的字典排序顺序发出,
所以如果输入迭代器进行排序,结合会产生元组排序,每个元素都是基于他们位置的独特元素,并不是按照他们的价值
所以如果输入元素是独一无二的,每个组合中都没有重复的值
例子:
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