Python Iteration,itertools(Python迭代器,itertool個人總結)

來源:互聯網
上載者:User

標籤:

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個人總結)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.