要判斷乙個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 再次呼叫這個函式時,一切都將從頭建立。...