for迴圈在Python中的工作原理詳細

2022-09-26 18:21:16 字數 2140 閱讀 2349

例如:

作用於列表

>>> 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...