學習前,我們回想一下可以直接作用於for
迴圈的資料型別有以下幾種:
1.集合資料型別,如list
、tuple
、dict
、set
、str
等;
2.是generator
,包括生成器和帶yield
的generator function。
這些可以直接作用於for
迴圈的物件統稱為可迭代物件:iterable.(可迭代物件你可以簡單的理解可迴圈的物件)
我們怎麼判斷乙個物件是不是可迴圈或者可迭代的?
可以使用isinstance()
判斷乙個物件是否是iterable
物件: #isinstance()內建的方法
而生成器不但可以作用於for
迴圈,還可以被next()
函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration
錯誤表示無法繼續返回下乙個值了。
可以被next()
函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator
。
生成器一定是迭代器,而迭代器不一定是生成器(生成器有next方法,迭代器有next方法不一定是生成器)
生成器都是iterator
物件,但list
、dict
、str
雖然是iterable
,卻不是iterator
。
把list
、dict
、str
等iterable
變成iterator
可以使用iter()
函式:
python的iterator
物件表示的是乙個資料流,iterator物件可以被next()
函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration
錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下乙個資料,所以iterator
的計算是惰性的(走到這一步,我才計算,不走到這一步,我就不計算),只有在需要返回下乙個資料時它才會計算。
iterator
甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
總結:
1.凡是可作用於for
迴圈的物件都是iterable
型別;
2.凡是可作用於next()
函式的物件都是iterator
型別,它們表示乙個惰性計算的序列;
集合資料型別如list
、dict
、str
等是iterable
但不是iterator
,不過可以通過iter()
函式獲得乙個iterator
物件。
在python2.7和python3的range()方法實現的原理是不一樣的,下面我們就來用**看看,**如下:12
3456
>>>
range
(
5
)
#python2.7
[
0
,
1
,
2
,
3
,
4
]
>>>
xrange
(
5
)
#python2.7
xrange
(
5
)
>>>
range
(
5
)
#python3.5
range
(
0
,
5
)
從上面的**可以看出,在python2.7中range()只是乙個list,在python3中是乙個迭代器,python2.7中xrange()跟python3中的range()功能是一樣的。這就是為什麼有同學會問python2.7中xrange()比range()方法更快,
python3中的range()方法實現的原理如下:12
for
x
in
range
(
5
):
pass
實際相當於:range方法就是next()取的,只是封裝了,我們看不到12
3456
78910
# 首先獲得iterator物件:
it
=
iter
([
1
,
2
,
3
,
4
,
5
])
# 迴圈:
while
true
:
try
:
# 獲得下乙個值:
x
=
next
(it)
except
stopiteration:
# 遇到stopiteration就退出迴圈
break
在python 2.7 中,檔案方法有f.xreadlines(),然後後面就可以用f.next()方法。在3.0中都一樣被封裝,了解一下就行,以後看到反正咱看得懂
小白的Python之路 day4 軟體目錄結構規範
設計專案目錄結構 就和 編碼風格 一樣,屬於個人風格問題。對於這種風格上的規範,一直都存在兩種態度 一類同學認為,這種個人風格問題 無關緊要 理由是能讓程式work就好,風格問題根本不是問題。另一類同學認為,規範化能更好的控制程式結構,讓程式具有更高的可讀性。我是比較偏向於後者的,因為我是前一類同學...
小白的Python之路 day4 生成器並行運算
我們已經明白生成器內部的結構,其實就是通過像函式這樣的東西實現的!多執行緒和單執行緒 簡單來說多執行緒就是並行運算,單執行緒就是序列運算 第一步 生成乙個生成器 第二步 執行第乙個next方法,開始呼叫函式,執行到yield時中斷,把返回值返回給變數 moon cake 下面有next有幾次執行幾次...
獻給小白的筆記day4
for 初始化語句 迴圈條件語句 迭代語句 for語句執行流程 while 迴圈條件語句 do while 迴圈條件語句 do while語句執行流程,先執行迴圈語句,再判斷條件,true繼續執行,false結束迴圈 break continue break 破壞整個迴圈 continue 跳過本次...