以下都是我自學python整理的筆記,以便幫助學習。
1.容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個的迭代獲取,可以用in,not in關鍵字判斷元素是否在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例並不是把所有的元素存在記憶體,比如迭代器和生成器物件)在python中,常見的容器物件有:list,set,dict,tuple,str...
2.儘管絕大多數容器都提供了某種方式來獲取其中的每乙個元素,但這並不是容器本身提供的能力,而是**可迭代物件**賦予了容器這種能力,當然並不是所有的容器都是可迭代的,比如:[bloom filter],雖然bloom filter可以用來檢測某個元素是否包含在容器中,但是並不能從容器中獲取其中的每乙個值,因為bloom filter壓根就沒把元素儲存在容器中,而是通過乙個雜湊函式對映成乙個值儲存在陣列中。
1.許多容器都是可迭代物件,但也有很多不是容器的物件也是可迭代物件,比如處於開啟狀態的files,socket等。
2.可迭代物件都具有__iter__函式,並且可迭代物件通過iter()函式會返回乙個迭代器,迭代器內部具有乙個狀態,該狀態用於記錄當前迭代所在的位置方便下一次迭代。
3.迭代器有一種具體的迭代器型別,比如list_iterator,set_iterator。可迭代物件實現了__iter__方法,該方法返回乙個迭代器物件。
1.迭代器是一種帶狀態的物件,它能在你呼叫next()方法的時候返回容器中的下乙個值,任何實現了__iter__和__next__方法的物件都是迭代器,__iter__返回迭代器本身,__next__返回容器中的下乙個值,當遍歷到最後乙個值,沒有元素的時候會丟擲stopiteration異常。
2. itertools函式返回的都是迭代器物件。
3.迭代器不會一次性把所有元素載入到記憶體,而是需要的時候才生成返回結果。迭代器就像乙個懶載入的工廠,等到有人需要的時候才給它生成值返回,沒呼叫的時候就處於休眠狀態等待下一次呼叫。
4.三種常見的迭代器:
(1)無限迭代器,
這個可以理解成一條無限延長的直線。
itertools模組下的count(start)函式,star為起點。
help(itertools.count)#檢視幫助文件count(start=0, step=1) -->count object
| return a count object whose .__next__
() method returns consecutive values.
def count(firstval=0, step=1):
| x =firstval
| while 1:
| yield
x | x += step
例子:
importitertools
>>> counter = itertools.count(start=2)
>>>next(counter)
2>>>next(counter)
3>>>next(counter)
4
(2)通過乙個有限序列生成無限迭代器,這個可以理解為是乙個圓,無限遍歷。
itertools下的cycle(iterable)函式,引數是乙個可迭代物件。
help(itertools.cycle)cycle(iterable) -->cycle object
| return elements from the iterable until it is
exhausted.
|then repeat the sequence indefinitely. #
從可迭代物件取出所有的元素然後無限迴圈
例子:
>>> from itertools importcycle
>>> colors = cycle(['
red','
white
','blue'])
>>>next(colors)
'red
'>>>next(colors)
'white
'>>>next(colors)
'blue
'>>>next(colors)
'red
'>>>next(colors)
'white
'
(3)有限迭代器,其實就是無限迭代器中擷取一段序列。
itertools下的islice(iterable, start, stop[, step])
iterable為可迭代物件,start為起點,不給start值時,預設從0開始,給值時會預設從起點的下乙個元素開始遍歷,stop為終點,step為步長。
help(itertools.islice)class
islice(builtins.object)
| islice(iterable, stop) -->islice object
| islice(iterable, start, stop[, step]) -->islice object
#返回乙個迭代器,iterable可迭代物件,start如果不設定為0,設定了會預設從start下乙個元素開始遍歷,stop終止,step步長。
例子:
>>> from itertools importislice
>>> num = cycle((1,2,3))
>>> limited = islice(num,0,4)
>>>next(limited)
1>>>next(limited)
2>>>next(limited)
3>>>next(limited)
1>>>next(limited)
traceback (most recent call last):
file
"", line 1, in
stopiteration
1.生成器是一種特殊的迭代器,不過這種迭代器更加優雅。需要乙個yiled
關鍵字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一種懶載入的模式生成值。
2.生成器有延遲作用,就是有需要的時候才會生產資料,不是立即產生結果。
生成器只能遍歷一次。
4.兩種方法得到生成器:
(1)定義生成器函式,返回值用yield而不是return,yield和return最本質的區別在於return會終止函式,不會保留函式中的變數,再次如果再次呼叫函式時從頭開始;而yield相當於在是凍結函式,給了函式乙個狀態,讓他暫時掛起保留此次呼叫的變數,下一次繼續這個位置呼叫。
看例子:
#用returndeffunc(var):
while var >0:
(var)
return
var var -= 1d = func(10)
(type(d))
10'int
'>
#用yield
deffunc(var):
while var >0:
yield
var
#return var
var -= 1d = func(10)
(type(d))
'generator
'>#type看到d是乙個生成器
#所以我們可以對d進行for迴圈遍歷for i in
d:print
(i)
10987654
321
(2)生成器表示式:把列表推導式的[ ]改成( )
使用生成器表示式取代列表推導式可以同時節省 cpu 和 記憶體(ram)。
gen = (i for i in range(10))
gen = (i for i in range(10))(type(gen))
for var in
gen:
(var)
'generator
'>012
3456
789
Python生成器與迭代器
生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...
python 迭代器與生成器
迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...
Python 迭代器與生成器
一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...