Python Iteration,itertools(Python迭代器,itertool我的總結)

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

相關文章
相關標籤/搜索