標籤:
1.迭代是什嗎?
首先看三個例子:
當迭代的對象是一個list對象的時候,他列印的是每一個list對象
for i in [1,2,3,4]: print(i)列印的結果:1234
當我們迭代的對象是一個字串的時候,他會一一列印出字串的每一個字元
for c in ‘Python‘: print(c)列印的結果是:Python
當我們迭代的對象是一個字典(dict)時,他會遍曆他的keys
for k in {‘x‘:1,‘y‘:2}: print(k)列印的結果是:xyadd1:(有時候我們會發現列印的結果會是:yx
為什麼呢?
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>123File "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 itertoolsd=[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 itertoolspartlist1=‘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 itertoolspartlist1=‘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 itertoolspartlist1=‘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 itertoolspartlist1=‘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 itertoolspartlist1=[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 itertoolspartlist1=[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 itertoolspartlist1=[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 itertoolsprint(list(itertools.starmap(pow,[(2,3),(3,2)])))列印的結果是:[8, 9]
3.12
itertools.tee(it,n)
返回n個迭代器it的複製迭代器。
學習Python中,大二學生,感興趣的可以交朋友。qq:904727147
Python Iteration,itertools(Python迭代器,itertool個人總結)