for 迴圈是對容器進行迭代的過程。
迭代就是從某個容器物件中逐個地讀取元素,直到容器中沒有更多元素為止。
先判斷物件是否為可迭代物件,不是的話直接報錯,丟擲typeerror異常,是的話,呼叫__iter__
方法,返回乙個迭代器
不斷地呼叫迭代器的__next__
方法,每次按序返回迭代器中的乙個值
迭代到最後,沒有更多元素了,就丟擲異常 stopiteration,這個異常 python 自己會處理,不會暴露給開發者
for 迴圈本質是不斷地呼叫迭代器的__next__
方法,直到有 stopiteration 異常為止,
所以任何可迭代物件都可以作用在for迴圈中。
弄明白了 for 的執行原理之後,我們就可以實現自己的迭代器用在 for 迴圈中:
1 classmyrange:
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 迴圈中試試:
1for 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的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...