1. 程式人生 > >windows下搭建virtualenv、virtualenvwrapper虛擬環境

windows下搭建virtualenv、virtualenvwrapper虛擬環境

什麼是迭代?

如果給定一個list或tuple,我們可以通過for迴圈來遍歷這個list或tuple,這種遍歷我們稱為迭代(Iteration)。

在Python中,迭代是通過for … in來完成的,而很多語言比如C或者Java,迭代list是通過下標完成的

可以看出,Python的for迴圈抽象程度要高於Java的for迴圈,因為Python的for迴圈不僅可以用在list或tuple上,還可以作用在其他可迭代物件上。

list這種資料型別雖然有下標,但很多其他資料型別是沒有下標的,但是,只要是可迭代物件,無論有無下標,都可以迭代,比如dict就可以迭代

什麼是可迭代的物件?

如果物件實現了能返回迭代器的__iter__方法,那麼物件就是可迭代的,如果沒有實現__iter__方法,會繼續查詢是否實現了實現了__getitem__方法,其引數是從零開始的索引,如果實現了__getitem__,這種物件也可以迭代。(程式中的呼叫過程我們是看不到的,是在內部實現的)

瞭解了以上理論知識,下面看下list是Iterable還是Iterator??
這裡寫圖片描述
這裡寫圖片描述
所以list是可迭代物件

我們再建立一個公司類,初始化公司員工列表,實現了__getitem__方法,建立company物件進行迭代
這裡寫圖片描述
可以迭代的原因:iter函式
當直譯器需要迭代物件x時,會自動呼叫iter(x)。
內建的iter函式有以下作用。
(1) 檢查物件是否實現了__iter__方法,如果實現了就呼叫它,獲取一個迭代器。
(2) 如果沒有實現__iter__方法,但是實現了__getitem__方法,Python 會建立一個迭代器,嘗試按順序(從索引 0 開始)獲取元素。
(3) 如果嘗試失敗,Python 丟擲TypeError異常,通常會提示“C objectis not iterable”(C 物件不可迭代),其中C 是目標物件所屬的類。

什麼是迭代器?

可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器:Iterator

Python的Iterator物件表示的是一個數據流,Iterator物件可以被next()函式呼叫並不斷返回下一個資料,直到沒有資料時丟擲StopIteration錯誤。可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下一個資料,所以Iterator的計算是惰性的,只有在需要返回下一個資料時它才會計算。

可迭代物件和迭代器的關係?

這裡寫圖片描述
Iterable和Iterator抽象基類。Iterator繼承了Iterable
Iterable.__iter__方法返回了一個Iterator例項。
Iterator類必須實現__next__方法。Iterator.__iter__方法直接返回例項本身

下面兩張圖是使用pycharm檢視的,是用python模擬C實現的類似原始碼的幫助文件。可以看到Iterator裡的__next__方法,而Iterable沒有實現該方法
這裡寫圖片描述
這裡寫圖片描述

我們要明確可迭代的物件和迭代器之間的關係:Python從可迭代的物件中獲取迭代器。
這裡寫圖片描述