欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Python中for循環(huán)是如何工作的

 更新時(shí)間:2017年06月30日 14:36:24   作者:FOOFISH  
如果你對(duì)python中的for循環(huán)不是很清楚,那么建議你看看這篇文章,本文主要給大家介紹了關(guān)于Python中for循環(huán)是如何工作的相關(guān)資料,介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。

前言

for...in 是Python程序員使用最多的語(yǔ)句,for 循環(huán)用于迭代容器對(duì)象中的元素,這些對(duì)象可以是列表、元組、字典、集合、文件,甚至可以是自定義類(lèi)或者函數(shù),例如:

作用于列表

>>> for elem in [1,2,3]:
...  print(elem)
...
1
2
3

作用于元組

>>> for i in ("zhang", "san", 30):
...  print(i)
...
zhang
san
30

作用于字符串

>>> for c in "abc":
...  print(c)
...
a
b
c

作用于集合

>>> for i in {"a","b","c"}:
...  print(i)
...
b
a
c

作用于字典

>>> for k in {"age":10, "name":"wang"}:
...  print(k)
...
age
name

作用于文件

>>> for line in open("requirement.txt"):
...  print(line, end="")
...
Fabric==1.12.0
Markdown==2.6.7

可能有人不經(jīng)要問(wèn),為什么這么多不同類(lèi)型對(duì)象都支持 for 語(yǔ)句,還有哪些類(lèi)型的對(duì)象可以作用在 for 語(yǔ)句中呢?回答這個(gè)問(wèn)題之前,我們先要了解 for 循環(huán)背后的執(zhí)行原理。

for 循環(huán)是對(duì)容器進(jìn)行迭代的過(guò)程,什么是迭代?迭代就是從某個(gè)容器對(duì)象中逐個(gè)地讀取元素,直到容器中沒(méi)有更多元素為止。那么,哪些對(duì)象支持迭代操作?任何對(duì)象都可以嗎?先隨便自定義一個(gè)類(lèi)試試,看行不行:

>>> class MyRange:
...  def __init__(self, num):
...   self.num = num
...
>>> for i in MyRange(10):
...  print(i)
...
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'MyRange' object is not iterable

錯(cuò)誤堆棧日志非常清楚地告訴我們,MyRange 不是一個(gè)可迭代對(duì)象,所以它不能用于迭代,那么到底什么樣的對(duì)象才稱(chēng)得上是可迭代對(duì)象(iterable)呢?

可迭代對(duì)象需要實(shí)現(xiàn)__iter__方法,并返回一個(gè)迭代器,什么是迭代器呢?迭代器只需要實(shí)現(xiàn) __next__方法?,F(xiàn)在我們就來(lái)驗(yàn)證一下列表為什么支持迭代:

>>> x = [1,2,3]
>>> its = x.__iter__() # x有此方法,說(shuō)明列表是可迭代對(duì)象
>>> its
<list_iterator object at 0x100f32198>

>>> its.__next__() # its有此方法,說(shuō)明its是迭代器
1
>>> its.__next__()
2
>>> its.__next__()
3
>>> its.__next__()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

從試驗(yàn)結(jié)果來(lái)看,列表是一個(gè)可迭代對(duì)象,因?yàn)樗鼘?shí)現(xiàn)了 __iter__方法,并且返回了一個(gè)迭代器對(duì)象(list_iterator),因?yàn)樗鼘?shí)現(xiàn)了 __next__方法。我們看到它不斷地調(diào)用__next__方法,其實(shí)就是不斷地迭代獲取容器中的元素,直到容器中沒(méi)有更多元素拋出 StopIteration 異常為止。

那么 for 語(yǔ)句又是如何循環(huán)的呢?到這里,恐怕你也猜到了,它的步驟是:

  • 先判斷對(duì)象是否為可迭代對(duì)象,不是的話直接報(bào)錯(cuò),拋出TypeError異常,是的話,調(diào)用 __iter__方法,返回一個(gè)迭代器
  • 不斷地調(diào)用迭代器的__next__方法,每次按序返回迭代器中的一個(gè)值
  • 迭代到最后,沒(méi)有更多元素了,就拋出異常 StopIteration,這個(gè)異常 python 自己會(huì)處理,不會(huì)暴露給開(kāi)發(fā)者

對(duì)于元組,字典,字符串也是同樣的道理,弄明白了 for 的執(zhí)行原理之后,我們就可以實(shí)現(xiàn)自己的迭代器用在 for 循環(huán)中。

前面的 MyRange 報(bào)錯(cuò)是因?yàn)樗鼪](méi)有實(shí)現(xiàn)迭代器協(xié)議里面的這兩個(gè)方法,現(xiàn)在繼續(xù)改進(jìn):

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:
   # 達(dá)到某個(gè)條件時(shí)必須拋出此異常,否則會(huì)無(wú)止境地迭代下去
   raise StopIteration() 

因?yàn)樗鼘?shí)現(xiàn)了__next__方法,所以 MyRange 本身已經(jīng)是一個(gè)迭代器了,所以 __iter__返回的就是對(duì)象本身 self?,F(xiàn)在用在 for 循環(huán)中試試:

for i in MyRange(3):
 print(i)
# 輸出
 0
 1
 2

有沒(méi)有發(fā)現(xiàn),自定義的 MyRange 功能和內(nèi)建函數(shù) range很相似。for 循環(huán)本質(zhì)是不斷地調(diào)用迭代器的__next__方法,直到有 StopIteration 異常為止,所以任何可迭代對(duì)象都可以作用在for循環(huán)中。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python實(shí)現(xiàn)自動(dòng)識(shí)別數(shù)字驗(yàn)證碼

    Python實(shí)現(xiàn)自動(dòng)識(shí)別數(shù)字驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Python來(lái)自動(dòng)識(shí)別數(shù)字驗(yàn)證碼,以便在需要時(shí)自動(dòng)填寫(xiě)或驗(yàn)證驗(yàn)證碼,有需要的小伙伴可以參考一下
    2024-04-04
  • python解決字符串倒序輸出的問(wèn)題

    python解決字符串倒序輸出的問(wèn)題

    今天小編就為大家分享一篇python解決字符串倒序輸出的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-06
  • Python?Playwright的使用詳解

    Python?Playwright的使用詳解

    本篇博客為大家介紹一款新的自動(dòng)化測(cè)試工具,效果類(lèi)似?selenium,但是這個(gè)模塊年輕。模塊名稱(chēng)為?playwright-python,微軟開(kāi)源的,是針對(duì)?Python?語(yǔ)言的純自動(dòng)化工具,感興趣的可以了解一下
    2022-10-10
  • Django Admin中增加導(dǎo)出CSV功能過(guò)程解析

    Django Admin中增加導(dǎo)出CSV功能過(guò)程解析

    這篇文章主要介紹了Django Admin中增加導(dǎo)出CSV功能過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python計(jì)算機(jī)視覺(jué)opencv圖像金字塔輪廓及模板匹配

    python計(jì)算機(jī)視覺(jué)opencv圖像金字塔輪廓及模板匹配

    這篇文章主要為大家介紹了python計(jì)算機(jī)視覺(jué)opencv圖像金字塔圖像輪廓及模板匹配的學(xué)習(xí)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • python基礎(chǔ)教程之csv文件的寫(xiě)入與讀取

    python基礎(chǔ)教程之csv文件的寫(xiě)入與讀取

    CSV即逗號(hào)分隔值(也稱(chēng)字符分隔值,因?yàn)榉指舴梢圆皇嵌禾?hào)),是一種常用的文本格式,用以存儲(chǔ)表格數(shù)據(jù),包括數(shù)字或者字符,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)教程之csv文件的寫(xiě)入與讀取的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • python 獲取url中的參數(shù)列表實(shí)例

    python 獲取url中的參數(shù)列表實(shí)例

    今天小編就為大家分享一篇python 獲取url中的參數(shù)列表實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 構(gòu)建?Python?命令行參數(shù)的?4?種常見(jiàn)方式

    構(gòu)建?Python?命令行參數(shù)的?4?種常見(jiàn)方式

    這篇文章主要介紹了構(gòu)建?Python?命令行參數(shù)的?4?種常見(jiàn)方式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Python 詞典(Dict) 加載與保存示例

    Python 詞典(Dict) 加載與保存示例

    今天小編就為大家分享一篇Python 詞典(Dict) 加載與保存示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python 安裝 virturalenv 虛擬環(huán)境的教程詳解

    Python 安裝 virturalenv 虛擬環(huán)境的教程詳解

    這篇文章主要介紹了Python 安裝 virturalenv 虛擬環(huán)境的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論