中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

解決Python 函數聲明先后順序出現的問題

發布時間:2020-10-08 20:56:22 來源:腳本之家 閱讀:163 作者:Yanbin 欄目:開發技術

在 Python 中如果把函數定義寫在調用的下方可能會出錯,例如下面的代碼

foo()

def foo():
 print("hello")

執行時會報出錯誤

NameError: name 'foo' is not defined

這時候要把 foo() 調用代碼放到該函數的聲明后面

def foo():
 print("hello")

foo()

這樣執行就一切正常了。這仿佛像是 C 語言中的函數調用需要提前聲明一般,例如在 C 語言中要調用后頭的定義的函數要寫成

void foo();
 
int main() {
 foo();
}
 
void foo() {
 printf("Hello");
}

實際上 Python 中并不存在函數提前聲明一說,也不能像 Java 那樣函數可以寫在任意位置,因為 Java 是編譯型的語言,Python 是解釋型的。

而且也不是一定要求被調用的函數一定要在源代碼層面上定義在調用者前方。

Python 中函數聲明的順序據我理解有兩條規則

  • Python 源代碼是由上往下解釋的
  • 找到程序入口(未包含在函數中的代碼) 即開始執行,執行到的函數未被先行解釋到即報錯

分析下面兩段代碼

def foo():
 bar()
 
if __name__ == '__main__':
 foo()
 
def bar():
 print("hello")

Python 從第 1 行一直解釋到第 4 行的入口,進而往回跳,調用到第 1 行的 foo() 函數,而其中的 bar() 函數還未及被解釋到,所以會提示

NameError: name 'bar' is not define

有一個很好的分析工具 http://pythontutor.com/live.html#mode=edit,我們來看上面的代碼

解決Python 函數聲明先后順序出現的問題

解釋到第二行 bar() 的時候,Global frame 里只有 foo, bar 還不存在

如果把程序入口往后調

def foo():
 bar()
 
def bar():
 print("hello")
 
if __name__ == '__main__':
 foo()

上面代碼執行無誤,輸出

hello

foo() 調用的 bar() 不也是在它下方聲明的嗎?所以這一點與 C 是有區別的。

也用http://pythontutor.com/live.html#mode=edit 來看看

解決Python 函數聲明先后順序出現的問題

解釋到第 8 行的時候在 Global frame 中 foo, bar 都有了,所以能成功調用。

這時候的理解是這樣的,Python 從第 1 行自上往下解釋到第 7 行的程序入口時,foo() 并未實際調用 bar(),但 foo() 和 bar() 函數都已解釋到了,所以回過頭來 foo() 與 bar() 之間怎么調用都無妨。

因此,最好的實踐方法就是把程序的入口放到代碼的最下方,那么它前面的函數不管如何的聲明順序都沒有關系。

以上就是解決Python 函數聲明先后順序的問題的詳細內容,更多關于python 函數聲明順序的資料請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

积石山| 无极县| 海南省| 沙湾县| 株洲县| 濮阳县| 南木林县| 永康市| 夏邑县| 阳新县| 三都| 常山县| 修文县| 庆阳市| 都昌县| 新民市| 金湖县| 平邑县| 青冈县| 琼结县| 同仁县| 荃湾区| 武胜县| 阳信县| 上栗县| 正宁县| 安陆市| 黔南| 古丈县| 玉环县| 兴义市| 新沂市| 和顺县| 内江市| 敖汉旗| 双峰县| 萨迦县| 朝阳县| 洪江市| 六枝特区| 武陟县|