2010-09-20 140 views
53

在沒有完全定義它的情況下調用函數是否可能?當嘗試這個時,我得到錯誤:「function_name未定義」。我來自C++背景,所以這個問題困擾着我。在Python文件末尾聲明函數

聲明函數作品前:

def Kerma(): 
     return "energy/mass"  

print Kerma() 

但是,試圖調用函數不首先確定它給了麻煩:

print Kerma() 

def Kerma(): 
    return "energy/mass" 

在C++中,你可以調用後聲明函數一次你把它的標題放在它之前。

我在這裏錯過了什麼嗎?

+3

在Python中沒有「聲明」。有定義(必須完整)或者什麼都沒有。 – 2010-09-20 18:35:15

+2

你說,「它給了麻煩」。你能詳細說明一下嗎? – 2010-09-20 18:51:56

+0

[聲明在python函數調用後的函數]可能的重複(http://stackoverflow.com/questions/17953219/declaration-functions-in-python-after-call) – user 2016-12-01 16:45:25

回答

93

一種方式是寫:

def main(): 
    print Kerma() 

def Kerma(): 
    return "energy/mass"  

if __name__ == '__main__': 
    main() 

這樣只要你不斷的打電話末尾的功能main你寫你自己喜歡的順序碼。

+1

@Muhammad:雖然這是一種可行的方法,但它在Python中確實不是慣用的。恰恰相反,你會注意到大多數'main'函數通常放在最後。 – 2010-09-20 18:28:21

+8

@Eli Bendersky:我會提交'if __name__ =='__main __':'開關是常見的慣用部分。 – 2010-09-20 18:36:03

+2

@Eli:慣用部分是最後的if子句:模塊頂層沒有代碼,然後在模塊爲__main__的情況下調用main函數。 – 2010-09-20 18:36:24

7

這在Python中是不可能的,但坦率地說,你很快就會發現你根本不需要它。 Pythonic編寫代碼的方式是將程序劃分爲定義類和函數的模塊,以及導入所有其他模塊並運行的單個「主模塊」。

對於簡單的不必要的腳本,習慣於將「可執行部分」放在最後,或者更好,學會使用交互式Python shell。在Python是那種地道

1

Python是一種動態語言,解釋器總是在調用變量(函數,...)時調用它們的狀態。你甚至可以重新定義一些if塊中的函數,並且每次都調用它們。這就是爲什麼你必須在調用它們之前定義它們。

11

當運行Python模塊(.py文件)時,它的頂層語句按照它們出現的順序從上到下(從頭到尾)執行。這意味着在定義它之前你不能引用某些東西。例如,以下將生成所示的錯誤:

c = a + b # -> NameError: name 'a' is not defined 
a = 13 
b = 17 

不像許多其他語言,defclass語句在Python —的可執行程序絕不只是聲明—所以你不能可以引用在此之前,他們是定義。這就是爲什麼你的第一個例子遇到問題—在引用Kerma()函數之前,它的def語句已經執行並且正文已經被處理,並且結果函數對象被綁定到函數的名字,所以它沒有在腳本中的那個點上定義。

像C++這樣的語言程序通常會在運行之前進行預處理,並且在編譯階段,整個程序和它引用的所有文件都會被一次性讀取和處理。與Python不同的是,這種語言具有聲明性語句,它允許在使用之前聲明(但未定義)函數的名稱和調用順序(或靜態類型的變量),以便當編譯器遇到它們的名稱時,它具有足夠的信息來檢查它們用法,主要涉及類型檢查和類型轉換,其中沒有一個要求它們的實際內容或代碼體已經被定義。