可迭代物件
可以被for迴圈迭代的物件為可迭代物件(iterable)
可以使用isinstance()判斷乙個物件是否是iterable物件:
>>>
from collections import iterable
>>> isinstance(, iterable)
true
>>> isinstance({}, iterable)
true
>>> isinstance('abc', iterable)
true
>>> isinstance((x for x in range(10)), iterable)
true
>>> isinstance(100, iterable)
false
迭代器
迭代器是乙個可以記住遍歷的位置的物件。
迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。
迭代器有兩個基本的方法:iter() 和 next()。
i = iter('asd')
next(i)
>>>'a'
next(i)
>>>'s'
next(i)
>>>'d'
next(i)
traceback (most recent call last):
file
"", line 1, in
stopiteration
當序列遍歷完時,將丟擲乙個stopiteration(停止迭代)異常。
迭代器優點
1、「流式」資料處理方式*少記憶體消耗,節省記憶體空間
2、很方便使用,且只能取所有的資料取一次
迭代器的內部
可迭代物件:
物件裡面包含iter()方法的實現,物件的iter函式經呼叫之後會返回乙個迭代器,裡面包含具體資料獲取的實現
迭代器:
包含有next方法的實現,在正確範圍內返回期待的資料以及超出範圍後能夠丟擲stopiteration的錯誤停止迭代。
迭代器不但可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration錯誤表示無法繼續返回下乙個值了。
生成器都是iterator物件,但list、dict、str雖然是iterable,卻不是iterator
把list、dict、str等iterable變成iterator可以使用iter()函式:
乙個實現了iter方法的物件是可迭代的,乙個實現next方法的物件則是迭代器
生成器
生成器的本質就是迭代器
迭代器 我們知道是用來迭代可迭代物件的,而生成器是用來迭代方法的
我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處是可以節省記憶體。
如果在某些情況下,我們也需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。
生成器generator:
本質:迭代器(所以自帶了iter方法和next方法,不需要我們去實現)
特點:惰性運算,開發者自定義
1.生成器函式:
常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行。
只要有yield的關鍵字的函式就是生成器函式
乙個包含yield關鍵字的函式就是乙個生成器函式。yield可以為我們從函式中返回值,但是yield又不同於return,return的執行意味著程式的結束,呼叫生成器函式不會得到返回的具體的值,而是得到乙個可迭代的物件。每一次獲取這個可迭代物件的值,就能推動函式的執行,獲取新的返回值。直到函式執行結束。
特點
呼叫函式的之後函式不執行,返回乙個生成器
每次呼叫next方法的時候會取到乙個值
直到取完最後乙個,在執行next會報錯
生成器是特殊的迭代器
迭代器需要手動記錄迭代位置
生成器使用yield自動記錄迭代的位置
def
fei(num):
a = 0
b = 1
current_index = 0
print('11111111111')
while current_index < num:
a, b = b, a + b
current_index += 1
yield a, b
# yield b
print('222222222222')
result = fei(5)
print(next(result))
print('第一次next完成')
print(next(result))
print('第二次next完成')
輸出結果
11111111111
(1, 1)
第一次next完成
222222222222
(1, 2)
第二次next完成
yield from
def
gen1
():for c in
'ab':
yield c
for i in range(3):
yield i
print(list(gen1()))
defgen2
():yield
from
'ab'
yield
from range(3)
print(list(gen2()))
輸出結果:
['a', 'b', 0, 1, 2]
['a', 'b', 0, 1, 2]
yield的用法
yield 是乙個類似 return的關鍵字,迭代一次遇到yield時就返回yield後面的值。重點是:下一次迭代時,從上一次迭代遇到的yield後面的**開始執行。
簡要理解:yield就是 return 返回乙個值,並且記住這個返回的位置,下次迭代就從這個位置後開始。
# 斐波那契
deffunc
(n):
a,b = 0,1
while n > 0:
yield b
a,b = b,a+b
n -= 1
defsum
(n):
return list(func(n))
print(sum(5))
輸出的結果:
[1, 1, 2, 3, 5]
def
yield_test
(n):
for i in range(n):
yield call(i)
print("i=",i)
#做一些其它的事情
print("do something.")
print("end.")
defcall
(i):
return i*2
#使用for迴圈
for i in yield_test(5):
print(i,",")
輸出的結果:
0 ,
i= 0
2 ,i= 1
4 ,i= 2
6 ,i= 3
8 ,i= 4
do something.
end.
生成器和迭代器
可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...
迭代器和生成器
1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...
生成器和迭代器
1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...