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