1. 程式人生 > >人生苦短之Python叠代器

人生苦短之Python叠代器

我只 pre 十分 val ron 列表生成式 stop ava names

叠代

在Python中,如果給定一個list或者touple,我們可以通過for循環來遍歷,將值依次取出,這種遍歷稱為叠代。

在Python中是通過for...in..來進行遍歷的,在Java中則是通過下標來遍歷 for(int i;i<length;i++){},Python作為解釋性語言,在語法上是十分簡單的,可以遍歷數組集合,也可以遍歷字典。看下面的例子:

for name in names:
    print(name)

person = {‘name‘: ‘張三‘, ‘age‘: 14, ‘sex‘: ‘男‘}

for key in person:
    print(key)
for value in person.values():
    print(value)
for item in person.items():
    print(item)

for i, value in enumerate(names):
    print(i, value)

遍歷一個list或者touple使用for..in..,也可以直接遍歷字典的key或者value或者字典裏地item,同樣地如果我們需要跟其他語言中的那樣的下標的話,我們可以使用for i,xx in .. 來獲取下標,由此呢,我們也可以進行引用多個變量來進行叠代,例如將key和value值全部分別遍歷,可以使用for key, value in dic.item 來進行遍歷,使用起來是非常靈活地。

叠代器

list,dict,str等數據類型都可直接使用for循環遍歷,這些被稱為可叠代對象:Iterable,而生成器不但可以使用for循環遍歷,還可以調用next()函數不斷的調用返回下一個值,直到最後拋出StopIteration錯誤無法返回下一個值,這種可以被next()函數不斷調用返回下一個值的對象稱為叠代器:Iterator。

生成器都是iterator對象,但是list,dict,str等數據類型卻不是叠代器,因為叠代器都是可以被next()函數調用不斷地返回下一個值,它的大小是未知的,它需要生成了下一個值才會計算。我們可以使用iter()函數將這些可叠代對象變成叠代器。

上面提到了生成器,生成器是什麽呢?

我們先來看下列表生成式。我們生成一個列表,可以這樣做:

生成一個1-9的平方值的列表

L=[]

for x in range(1,10):

L.append(x*x)

如果用列表生成式可以是這樣:L=[x*x for x in range(1,10)],同時我們還可以加一些判斷,比如我只想要偶數的平方值,可以在後面加個if判斷。了解了列表生成式,我們在看下生成器。

最簡單地創建生成器的方式,L=(x*x for x in range(1,10)),將[]換成(),那麽完成後的區別在哪裏呢?

如果是列表生成式,我執行了一個列表生成式,它會根據生成式的條件立即生成一個列表,然後我可以對這個列表進行遍歷(叠代),這也就是上面說的list是可叠代對象;

如果它是個生成器,我運行了後它不會立即生成一個我想要的列表,它比較懶,它會在我需要的時候跟我生成一個我想要的值,什麽時候是我需要的呢,就是調用next()函數的時候,通過next()函數獲得生成器的下一個返回值,直到最後一個元素,沒有值了拋出StopIteration錯誤。它裏面保存的不是計算好的值,而是計算的算法,每次需要的時候給計算出來。

可以作用於for循環遍歷的對象都是可叠代對象

可以作用於next()函數的對象都是叠代器對象

我也學的有點蒙圈,暫時先這樣理解,在今後用的地方多了加深對這方面的理解。

人生苦短之Python叠代器