for迴圈 底層工作原理

2022-03-04 17:17:06 字數 1423 閱讀 1328

for 迴圈是對容器進行迭代的過程。

迭代就是從某個容器物件中逐個地讀取元素,直到容器中沒有更多元素為止。

先判斷物件是否為可迭代物件,不是的話直接報錯,丟擲typeerror異常,是的話,呼叫__iter__方法,返回乙個迭代器

不斷地呼叫迭代器的__next__方法,每次按序返回迭代器中的乙個值

迭代到最後,沒有更多元素了,就丟擲異常 stopiteration,這個異常 python 自己會處理,不會暴露給開發者

for 迴圈本質是不斷地呼叫迭代器的__next__方法,直到有 stopiteration 異常為止,

所以任何可迭代物件都可以作用在for迴圈中。

弄明白了 for 的執行原理之後,我們就可以實現自己的迭代器用在 for 迴圈中:

1 class

myrange:

2 def __init__

(self, num):

3 self.i =

0 4 self.num =

num 5

6 def __iter__

(self):

7 return

self

8 9 def __next__

(self):

10 if self.i <

self.num:

11 i =

self.i

12 self.i += 1

13 return

i14 else

:15 # 達到某個條件時必須丟擲此異常,否則會無止境地迭代下去

16 raise stopiteration()

因為它實現了__next__方法,所以 myrange 本身已經是乙個迭代器了,

所以__iter__返回的就是物件本身 self。

現在用在 for 迴圈中試試:

1

for i in myrange(3):

2print

(i)3#輸出

405 1

6 2

有沒有發現,自定義的myrange功能和內建函式range很相似。

綜上所述:

for 迴圈本質是不斷地呼叫迭代器的__next__方法,直到有 stopiteration 異常為止,所以任何可迭代物件都可以作用在for迴圈中。

python中的for迴圈底層原理詳解

一 構建乙個可迭代物件 列表 元組 字典等 tuple01 dict01自帶有 iter 屬性,即為可迭代物件 tuple01 stay hungry stay foolish keep looking,don t sate hobbies dict01 二 用for迴圈來進行迭代 1 如下所示 f...

執行緒池底層工作原理和流程

當提交任務執行excute時 1.若正在執行的執行緒數量小於corepoolsize,則執行緒池馬上建立執行緒執行任務 2.如果正在執行的執行緒數量大於等於corepoolsize,則多餘的任務加入阻塞佇列等待 3.如果佇列滿了且正在執行的執行緒數量小於maximumpoolsize,那麼還要建立非...

HashMap底層原理

1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...