例如:
作用於列表
>>> for elem in [1,2,3]:
... print(elem)
...1
23作用於字串
>>> for c in "abc":
... print(c)
...a
bc作用於字典
>>> for k in :
... print(k)
...age
name
可能有人不經要問,為什麼這麼多不同型別物件都支援for語句,還有哪些型別的物件可以作用在for語句中呢?回答這個問題之前,我們先要了解for迴圈背後的執行原理。
for迴圈是對容器進行迭代的過程,什麼是迭代?迭代就是從某個容器物件中逐個地讀取元素,直到容器中沒有更多元素為止。那麼,哪些物件支援迭代操作?任何物件都可以嗎?先隨便自定義乙個類試試,看行不行:
>>> class myrange:
... def __init__(self, num):
... self.num = num
...>>> for i in myrange(10):
... print(i)
...traceback (most recent call last):
file "", line 1, in
typeerror: 'myrange' object is not iterable
錯誤堆疊日誌非常清楚地告訴我們,myrange 不是乙個可迭代物件,所以它不能用於迭代,那麼到底什麼樣的物件才稱得上是可迭代物件(iterable)呢?
可迭代物件需要實現__iter__方法,並返回乙個迭代器,什麼是迭代器呢?迭代器只程式設計客棧需要實現__next__方法。現在我們就來驗證一下列表為什麼支援迭代:
>>> x = [1,2,3]
>>> its = x.__iter__() # x有此方法,說明列表是可迭代物件
>>> its
>>> its.__next__() # its有此方法,說明its是迭代器
1>>> its.__next__()
2>>> its.__next__()
3>>> its.__next__()
traceback (most recent call last):
file "", line 1, in
stopiteration
從試驗結果來看,列表是乙個可迭代物件,因為它實現了__iter__方法,並且返回了一程式設計客棧個迭代器物件(list_iterator),因為它實現了__next__方法。我們看到它不斷地呼叫__next__方法,其實就是不斷地迭代獲取容器中的元素,直到容器中沒有更多元素丟擲stopiteration異常為止。
那麼for語句又是如何迴圈的呢?到這裡,恐怕你也猜到了,它的步驟是:
對於元組,字典,字串也是同樣的道理,弄明白了 for 的執行原理之後,我們就可以實現自己的迭代器用在 for 迴圈中。
前面的myrange報錯是因為它沒有實現迭代器協議裡面的這兩個方法,現在繼續改進:
class myrange:
def __init__(self, num):
self.i = 0
self.num = num
def __iter__(self):
return self
def __next__(self):
if self.i < self.num:
i = self.i
self.i += 1
return i
else:
# 達到某個條件時fxoacff必須丟擲此異常,否則會無止境地程式設計客棧迭代下去
raise stopiteration()
因為它實現了__next__方法,所以myrange本身已經是乙個迭代器了,所以__iter__返回的就是物件本身self。現在用在 for 迴圈中試試:
for i in myrange(3):
print(i)
# 輸出
0 12
有沒有發現,自定義的myrange功能和內建函式range很相似。for迴圈本質是不斷地呼叫迭代器的__next__方法,直到有stopiteration異常為止,所以任何可迭代物件都可以作用在for迴圈中。
python 中else在while迴圈中的用法
else 可以在while和for迴圈中運用,else和while或for搭配使用,不再是條件判斷的含義。而是當while條件不成立時,直接跳出while迴圈,執行else輸出如 count 0 while count 12 if true print yes break count 1 else ...
如何優雅的在python中暫停死迴圈?
有時候在工作中可能會遇到要一直執行某個功能的程式,這時候死迴圈就派上用途了,python中死迴圈的具體形式大致如下 while true run your code 通常我們結束死迴圈的程式都是使用ctrl c,但是如果不對程式做處理的話,往往程式會以 異常 的方式結束程式,並且更多的時候我們希望程...
python中的for迴圈
一 for迴圈概要 for迴圈是乙個通用序列迭代器,可遍歷任何有序的序列物件內的元素,包括字串 列表 元組 其他內建可迭代物件。一般格式 for in if break if continue else 二 for迴圈應用舉例 1 遍歷序列元素 for x in spam eggs ham prin...