1.什麼叫迭代?
使用for迴圈遍歷取值的過程,叫做迭代
2.什麼是可迭代物件?
能夠使用for遍歷取值的物件,叫可迭代物件
可迭代物件:str、list、set、tuple 、dict
不可迭代物件: int 、float、class
3.什麼是迭代器?
迭代器是乙個可以記住遍歷的位置的物件
①迭代器物件從集合的第乙個元素開始訪問,直到所有元素被訪問完
②迭代器只能往前不會後退
4.如何判斷乙個物件是不是可迭代物件、迭代器?
①
from collections import iterable
from collections import iterator
isinstance
( obj, iterable )
#obj是不是可迭代物件
isinstance
( obj, iterator)
#判斷obj是不是迭代器?
5.如何建立迭代器
方法一:直接在可迭代物件(字串,列表或元組物件)上建立迭代器
方法二:把乙個類作為乙個迭代器使用, 需要在類中實現兩個方法iter() 與next() .
①__iter__() 方法:返回乙個特殊的迭代器物件, 這個迭代器物件實現了next() 方法並通過 stopiteration 異常標識迭代的完成。
②__next__() 方法:(python 2 裡是 next())會返回下乙個迭代器物件。
用法
#1. 建立迭代器 ,iter()函式
通過iter
()函式建立可迭代物件(比如:列表、元組、字串)的迭代器.
(字串,列表或元組物件都可用於建立迭代器)
#2. 遍歷取值
迭代器物件可以使用常規 for 語句進行遍歷,
也可以使用next
()函式來取值。iter
()函式實際上就是呼叫了可迭代物件的 __iter__ 方法
1. 什麼是生成器?
生成器是一種特殊的迭代器(乙個沒有__iter__和__next__方法的特殊迭代器),不儲存資料,儲存生成資料的方式
2.為什麼需要引入生成器?
當需要生成好多資料時,如果一下全部產生,將會占用好多記憶體。
eg:建立乙個包含100萬個元素的列表,不僅占用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了.
此時引入生成器,需要多少生成多少,什麼時候需要什麼時候繼續,而不用一下子全部產生。
3.生成器特點(節省空間,暫停程式,需要時再繼續執行):
①乙個沒有__iter__和__next__方法的特殊迭代器;
②函式只執行一部分就返回;
③可以讓乙個函式暫停執行,並且儲存上次的值,根據上次的值恢復到原來的樣子,再做接下來的操作;
④迭代器節省空間,實現迴圈;
⑤生成器可以讓乙個看起來像函式的**暫停執行,並根據自己的想法呼叫next/send繼續執行;
4.生成器的2種構建方式
1.將列表推導式的小括號換成中括號;
2.函式中使用yield
# 建立生成器模板
乙個函式中yield,此時這個函式不再是函式,而是生成器的模板
#建立生成器物件
當呼叫乙個函式時,發現該函式中有yield,那麼不再事呼叫函式,而是建立乙個生成器物件
5.生成器執行流程
當第一次呼叫for/next執行時,會從生成器的第一行開始依次向下執行,直到在迴圈中碰見yield,就會返回yield後面的變數/字元;
然後第二次呼叫for/next時,就會從上次的yield後面的**繼續執行,直到在迴圈中再次碰到yield,返回;依次往下,直到沒有了資料。
6.生成器、函式執行流程的區別
函式是順序執行,遇到return語句或者最後一行函式語句就返回。
而generator的函式,在每次呼叫next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
7.生成器啟動方式
①可以使用 for i in 生成器物件 來遍歷生成器中的資料,__ next__
②也可以用 next(生成器物件) 來乙個乙個獲取生成器中的值(呼叫next()執行生成器,並 返回yield的值);
③通過send()來啟動生成器,取裡生成器裡面的值(即返回yield的值)如下**
注意:一般 生成器物件.send(none) 不會放到第一次啟動生成器,如果非要這麼做,要傳入none
使用yield完成斐波那契數列
deffibonacci
(n):
a, b =0,
1 count_num =
0while count_num < n:
# 如果函式中有乙個yield語句,那麼這個就不再是函式,而是乙個生成器的模板
yield a
a, b = b, a+b
count_num +=
1# 如果在呼叫時發現這個函式中有yield,那麼此時,不是呼叫函式,而是建立乙個生成器物件
fb = fibonacci(5)
print
("使用for迴圈遍歷生成器中的所有數字"
.center(40,
"-")
)for i in fb:
print
(i)print
("使用next依次生成三次數字"
.center(40,
"-")
)print
(next
(fb)
)print
(next
(fb)
)print
(next
(fb)
)
send()啟動生成器
def
fibonacci
(n):
a, b =0,
1 count_num =
0while count_num < n:
ret =
yield a
print
("ret:"
, ret)
a, b = b, a+b
count_num +=1
fb = fibonacci(5)
print
(next
(fb)
)#send的引數會傳給 yield a ,當做yield a的結果,並賦值給ret
#send的結果是 :下次呼叫 yield時,yield後面a的值
print
(fb.send(
"haha"))
print
(next
(fb)
)# 0
# ret: haha
# 1# ret: none
# 1(我們可以理解為,第一次使用next,先執行等號右邊的**,就將yield a返回給了next
(fb);
然後下次呼叫send時,執行等號左邊的,將send的傳值賦值給ret,再執行後續**;
或者我們可以理解 ret =
yield a 為兩步===
>1.
yield a;
2.ret = arg;其中的arg表示send的傳值,如果不傳值,預設為none,所以當next在send後面呼叫時,就預設傳了none;)
Python 迭代器 生成器
可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...
python 迭代器,生成器
什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...
python 迭代器 生成器
知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...