日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Python教程:4. 執(zhí)行模型

4. 執(zhí)行模型

4.1. 程序的結(jié)構(gòu)

python 程序是由代碼塊構(gòu)成的。 代碼塊 是被作為一個(gè)單元來執(zhí)行的一段 Python 程序文本。 以下幾個(gè)都屬于代碼塊:模塊、函數(shù)體和類定義。 交互式輸入的每條命令都是代碼塊。 一個(gè)腳本文件(作為標(biāo)準(zhǔn)輸入發(fā)送給解釋器或是作為命令行參數(shù)發(fā)送給解釋器的文件)也是代碼塊。 一條腳本命令(通過 -c 選項(xiàng)在解釋器命令行中指定的命令)也是代碼塊。 通過在命令行中使用 -m 參數(shù)作為最高層級(jí)腳本(即 __main__ 模塊)運(yùn)行的模塊也是代碼塊。 傳遞給內(nèi)置函數(shù) eval() 和 exec() 的字符串參數(shù)也是代碼塊。

10年建站經(jīng)驗(yàn), 做網(wǎng)站、成都網(wǎng)站建設(shè)客戶的見證與正確選擇。創(chuàng)新互聯(lián)建站提供完善的營銷型網(wǎng)頁建站明細(xì)報(bào)價(jià)表。后期開發(fā)更加便捷高效,我們致力于追求更美、更快、更規(guī)范。

代碼塊在 執(zhí)行幀 中被執(zhí)行。 一個(gè)幀會(huì)包含某些管理信息(用于調(diào)試)并決定代碼塊執(zhí)行完成后應(yīng)前往何處以及如何繼續(xù)執(zhí)行。

4.2. 命名與綁定

4.2.1. 名稱的綁定

名稱 用于指代對(duì)象。 名稱是通過名稱綁定操作來引入的。

下面的結(jié)構(gòu)將名字綁定:

  • 函數(shù)的正式參數(shù),

  • 類定義,

  • 函數(shù)定義,

  • 賦值表達(dá)式,

  • 如果在一個(gè)賦值中出現(xiàn),則為標(biāo)識(shí)符的 目標(biāo) :

    • for 循環(huán)頭,

    • after as in a with statement, except clause, except* clause, or in the as-pattern in structural pattern matching,

    • 在結(jié)構(gòu)模式匹配中的捕獲模式

  • import 語句。

形式為 from ... import *import 語句綁定所有在導(dǎo)入的模塊中定義的名字,除了那些以下劃線開頭的名字。這種形式只能在模塊級(jí)別上使用。

del 語句的目標(biāo)也被視作一種綁定(雖然其實(shí)際語義為解除名稱綁定)。

每條賦值或?qū)胝Z句均發(fā)生于類或函數(shù)內(nèi)部定義的代碼塊中,或是發(fā)生于模塊層級(jí)(即最高層級(jí)的代碼塊)。

如果名稱綁定在一個(gè)代碼塊中,則為該代碼塊的局部變量,除非聲明為 nonlocal 或 global。 如果名稱綁定在模塊層級(jí),則為全局變量。 (模塊代碼塊的變量既為局部變量又為全局變量。) 如果變量在一個(gè)代碼塊中被使用但不是在其中定義,則為 自由變量。

每個(gè)在程序文本中出現(xiàn)的名稱是指由以下名稱解析規(guī)則所建立的對(duì)該名稱的 綁定

4.2.2. 名稱的解析

作用域 定義了一個(gè)代碼塊中名稱的可見性。 如果代碼塊中定義了一個(gè)局部變量,則其作用域包含該代碼塊。 如果定義發(fā)生于函數(shù)代碼塊中,則其作用域會(huì)擴(kuò)展到該函數(shù)所包含的任何代碼塊,除非有某個(gè)被包含代碼塊引入了對(duì)該名稱的不同綁定。

當(dāng)一個(gè)名稱在代碼塊中被使用時(shí),會(huì)由包含它的最近作用域來解析。 對(duì)一個(gè)代碼塊可見的所有這種作用域的集合稱為該代碼塊的 環(huán)境

當(dāng)一個(gè)名稱完全找不到時(shí),將會(huì)引發(fā) NameError 異常。 如果當(dāng)前作用域?yàn)楹瘮?shù)作用域,且該名稱指向一個(gè)局部變量,而此變量在該名稱被使用的時(shí)候尚未綁定到特定值,將會(huì)引發(fā) UnboundLocalError 異常。 UnboundLocalError 為 NameError 的一個(gè)子類。

如果一個(gè)代碼塊內(nèi)的任何位置發(fā)生名稱綁定操作,則代碼塊內(nèi)所有對(duì)該名稱的使用會(huì)被認(rèn)為是對(duì)當(dāng)前代碼塊的引用。 當(dāng)一個(gè)名稱在其被綁定前就在代碼塊內(nèi)被使用時(shí)則會(huì)導(dǎo)致錯(cuò)誤。 這個(gè)一個(gè)很微妙的規(guī)則。 Python 缺少聲明語法,并允許名稱綁定操作發(fā)生于代碼塊內(nèi)的任何位置。 一個(gè)代碼塊的局部變量可通過在整個(gè)代碼塊文本中掃描名稱綁定操作來確定。

如果 global 語句出現(xiàn)在一個(gè)代碼塊中,則所有對(duì)該語句所指定名稱的使用都是在最高層級(jí)命名空間內(nèi)對(duì)該名稱綁定的引用。 名稱在最高層級(jí)命名內(nèi)的解析是通過全局命名空間,也就是包含該代碼塊的模塊的命名空間,以及內(nèi)置命名空間即 builtins 模塊的命名空間。 全局命名空間會(huì)先被搜索。 如果未在其中找到指定名稱,再搜索內(nèi)置命名空間。 global 語句必須位于所有對(duì)其所列出名稱的使用之前。

global 語句與同一代碼塊中名稱綁定具有相同的作用域。 如果一個(gè)自由變量的最近包含作用域中有一條 global 語句,則該自由變量也會(huì)被當(dāng)作是全局變量。

nonlocal 語句會(huì)使得相應(yīng)的名稱指向之前在最近包含函數(shù)作用域中綁定的變量。 如果指定名稱不存在于任何包含函數(shù)作用域中則將在編譯時(shí)引發(fā) SyntaxError。

模塊的作用域會(huì)在模塊第一次被導(dǎo)入時(shí)自動(dòng)創(chuàng)建。 一個(gè)腳本的主模塊總是被命名為 __main__。

類定義代碼塊以及傳給 exec() 和 eval() 的參數(shù)是名稱解析上下文中的特殊情況。 類定義是可能使用并定義名稱的可執(zhí)行語句。 這些引用遵循正常的名稱解析規(guī)則,例外之處在于未綁定的局部變量將會(huì)在全局命名空間中查找。 類定義的命名空間會(huì)成為該類的屬性字典。 在類代碼塊中定義的名稱的作用域會(huì)被限制在類代碼塊中;它不會(huì)擴(kuò)展到方法的代碼塊中 — 這也包括推導(dǎo)式和生成器表達(dá)式,因?yàn)樗鼈兌际鞘褂煤瘮?shù)作用域?qū)崿F(xiàn)的。 這意味著以下代碼將會(huì)失敗:

 
 
 
 
  1. class A:
  2. a = 42
  3. b = list(a + i for i in range(10))

4.2.3. 內(nèi)置命名空間和受限的執(zhí)行

CPython 實(shí)現(xiàn)細(xì)節(jié): 用戶不應(yīng)該接觸 __builtins__,嚴(yán)格說來它屬于實(shí)現(xiàn)細(xì)節(jié)。 用戶如果要重載內(nèi)置命名空間中的值則應(yīng)該 import builtins 并相應(yīng)地修改該模塊中的屬性。

與一個(gè)代碼塊的執(zhí)行相關(guān)聯(lián)的內(nèi)置命名空間實(shí)際上是通過在其全局命名空間中搜索名稱 __builtins__ 來找到的;這應(yīng)該是一個(gè)字典或一個(gè)模塊(在后一種情況下會(huì)使用該模塊的字典)。 默認(rèn)情況下,當(dāng)在 __main__ 模塊中時(shí),__builtins__ 就是內(nèi)置模塊 builtins;當(dāng)在任何其他模塊中時(shí),__builtins__ 則是 builtins 模塊自身的字典的一個(gè)別名。

4.2.4. 與動(dòng)態(tài)特性的交互

自由變量的名稱解析發(fā)生于運(yùn)行時(shí)而不是編譯時(shí)。 這意味著以下代碼將打印出 42:

 
 
 
 
  1. i = 10
  2. def f():
  3. print(i)
  4. i = 42
  5. f()

eval() 和 exec() 函數(shù)沒有對(duì)完整環(huán)境的訪問權(quán)限來解析名稱。 名稱可以在調(diào)用者的局部和全局命名空間中被解析。 自由變量的解析不是在最近包含命名空間中,而是在全局命名空間中。 1 exec() 和 eval() 函數(shù)有可選參數(shù)用來重載全局和局部命名空間。 如果只指定一個(gè)命名空間,則它會(huì)同時(shí)作用于兩者。

4.3. 異常

異常是中斷代碼塊的正??刂屏鞒桃员闾幚礤e(cuò)誤或其他異常條件的一種方式。 異常會(huì)在錯(cuò)誤被檢測到的位置 引發(fā),它可以被當(dāng)前包圍代碼塊或是任何直接或間接發(fā)起調(diào)用發(fā)生錯(cuò)誤的代碼塊的其他代碼塊所 處理。

Python 解析器會(huì)在檢測到運(yùn)行時(shí)錯(cuò)誤(例如零作為被除數(shù))的時(shí)候引發(fā)異常。 Python 程序也可以通過 raise 語句顯式地引發(fā)異常。 異常處理是通過 try … except 語句來指定的。 該語句的 finally 子句可被用來指定清理代碼,它并不處理異常,而是無論之前的代碼是否發(fā)生異常都會(huì)被執(zhí)行。

Python 的錯(cuò)誤處理采用的是“終止”模型:異常處理器可以找出發(fā)生了什么問題,并在外層繼續(xù)執(zhí)行,但它不能修復(fù)錯(cuò)誤的根源并重試失敗的操作(除非通過從頂層重新進(jìn)入出錯(cuò)的代碼片段)。

當(dāng)一個(gè)異常完全未被處理時(shí),解釋器會(huì)終止程序的執(zhí)行,或者返回交互模式的主循環(huán)。 無論是哪種情況,它都會(huì)打印棧回溯信息,除非是當(dāng)異常為 SystemExit 的時(shí)候。

異常是通過類實(shí)例來標(biāo)識(shí)的。 except 子句會(huì)依據(jù)實(shí)例的類來選擇:它必須引用實(shí)例的類或是其所屬的 非虛基類 。 實(shí)例可通過處理器被接收,并可攜帶有關(guān)異常條件的附加信息。

備注

異常消息不是 Python API 的組成部分。 其內(nèi)容可能在 Python 升級(jí)到新版本時(shí)不經(jīng)警告地發(fā)生改變,不應(yīng)該被需要在多版本解釋器中運(yùn)行的代碼所依賴。

另請(qǐng)參看 try 語句 小節(jié)中對(duì) try 語句的描述以及 raise 語句 小節(jié)中對(duì) raise 語句的描述。

備注

1

出現(xiàn)這樣的限制是由于通過這些操作執(zhí)行的代碼在模塊被編譯的時(shí)候并不可用。


文章題目:創(chuàng)新互聯(lián)Python教程:4. 執(zhí)行模型
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/cdgeccp.html