Python大殺器 迭代器 生成器

2021-09-24 21:55:53 字數 3014 閱讀 5064

要判斷乙個pythonista編寫的**夠不夠pythonic,乙個很重要的標準就是看他能不能靈活運用迭代器。

首先要介紹一下什麼是迭代器:在python中有兩種迴圈語句,while和for。通常我們可以以c風格來使用它們,但是python額外提供了另外一種更為方便和高效的使用方式。通俗的來說就是邊生產邊消費。**易讀性和簡潔高效性之爭

首先要介紹一下幾個概念之間得差異:

可迭代物件: 除了列表、元組、字串、元組、集合、字典等序列外,只要實現了__iter__和__getitem__中任意乙個方法的物件都是可以進行迭代的。不同的是,在進行迭代的時候直譯器會呼叫iter函式,iter函式會檢查物件是否實現了__iter__方法,如果實現了就會呼叫它得到乙個生成器,如果沒有實現__iter__方法但是實現了 __getitem__方法,python 會建立乙個迭代器, 嘗試按順序(從索引 0 開始) 獲取元素。isinstance(objiect, iterable)只會檢測__iter__方法,忽略了__getitem__方法。

# coding=utf8

from collections import iterable

list_a =[3

,3,45

,6]dict_b =

set_c =

tuple_d =

('jfk'

,'dj'

,'ilsl'

)str_e =

'jkilljls'

isinstance

(list_a, iterable)

# true 列表是可迭代物件

isinstance

(dict_b, iterable)

# true 字典是可迭代物件

isinstance

(set_c, iterable)

# true 集合是可迭代物件

isinstance

(tuple_d, iterable)

# true 元組是可迭代物件

isinstance

(str_e, iterable)

# true 字串是可迭代物件

)#true 只要實現了__iter__方法則該物件就是可迭代物件,還有其他情況見後面

class

queue

:def

__init__

(self, q)

: self.queue = q

#def __iter__(self):

# for item in self.queue:

# yield item

def__getitem__

(self, item)

:return self.queue[item]

queue = queue([1

,4,5

,8])

isinstance

(queue, iterable)

#false 沒有實現__iter__方法,但是實現了__getitem__方法也是可迭代物件

#iterable只對__iter__方法進行檢測

for item in queue:

# 只要實現了__iter__和__getitem__中的任意乙個,則該物件都是可以進行迭代的。

print

(item)

迭代器: 實現了next方法和__iter__方法的物件,且next方法實現了迭代協議,__iter__方法返回迭代器。

如下是乙個迭代器類,可以產生迭代器物件,對迭代器物件呼叫iter函式返回迭代器類自身,迭代環境中自動呼叫__next__方法。

class

iter

:def

__init__

(self, data)

: self.data = data

self.now =

0def

__iter__

(self)

:return self

def__next__

(self)

:if self.now < data:

self.now +=

1return

(self.now-1)

**2raise stopiteration

生成器:生成器是一種特殊的迭代器,生成器自動實現了「迭代器協議」(即__iter__和next方法),不需要再手動實現兩方法。

3.1 生成器表示式:可以使用表示式來得到生成器

使用生成器表示式可以非常輕鬆的得到生成器,只要將列表解析式中的方括號換成圓括號就可以了。

(x for x in

range(5

))# iterator

def

gen(num)

: cou =

0while cou < num:

yield cou

cou +=

1

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...