究竟是在做這個代碼?
當您執行xy.py時,會導入ab。 import語句在導入時運行模塊,因此ab的操作在xy的剩餘部分之前執行。一旦完成了ab,它繼續xy。
解釋器會跟蹤哪些腳本正在運行__name__
。當你運行一個腳本時 - 不管你命名了它 - 解釋器稱它爲"__main__"
。這就是它如何跟蹤哪個腳本是主文件,這是在外部調用另一個腳本後返回的腳本。 (您可能會說'home'腳本。)從'main'腳本調用的任何其他腳本的文件名都是__name__
。因此,行if __name__ == "__main__" :
是解釋器的測試,用於確定它是在它正在查看的腳本(解析)上運行,還是暫時窺探到另一個腳本。這使程序員可以靈活地讓腳本在外部調用時表現不同。
要了解發生了什麼,請首先關注無縮略的行及其在腳本中的顯示順序。請記住,函數 - 或def
- 塊在調用之前不會自行執行任何操作。口譯員可能會認爲如果嘟to到自己:
- 打開xy.py.
- 導入並使用
__name__
ab.py打開文件。
- 哦,一個函數。我會記住的。
- 好的,function a();我剛剛瞭解到。我想我現在會打印。
- 文件結束;回到
'__main__'
!
- 哦,一個函數。我會記住的。
- 另一個。
- Function x();好吧,打印''。
- 這是什麼?一個
if
聲明。那麼,條件已經滿足(變量__name__
已被設置爲'__main__'
),所以我會打印'B功能'。
但是我認爲你沒有正確使用它。可能有例外,但底部兩行應該是:
if __name__ == "__main__":
main()
...這意味着「如果是這樣的‘主’或家庭腳本,執行所謂的main()
功能這就是爲什麼你會看到一個。 def main():
塊往上頂,其中包含的腳本功能的主流。
爲什麼我們實現這個?
(哇,我竟然想通了這部分了,而寫上面,這是部分我真的很掙扎導致瞭解,因爲我從來沒有寫過一個腳本,其中包含我從其他腳本調用的函數。)
請記住我剛纔所說的關於import語句的內容嗎?導入模塊時,它不會「識別」它,並等待進一步的指示。它實際上運行腳本中包含的所有可執行操作。因此,將腳本中的內容放入main()
函數可以有效隔離它,並將其隔離,以便在由其他腳本導入時不會立即運行它。
同樣,會有例外,但通常的做法是main()
通常不會從外部調用。所以你可能想知道另外一件事:如果我們不打電話給main()
,爲什麼我們要調用腳本?這是因爲許多人用自己構建的獨立函數來構建腳本。然後他們被稱爲腳本正文的其他地方。這使我想到這一點:
我們的代碼是工作,而這也
是的,你說得對。這些單獨的函數可以從main()
函數中不包含的內聯腳本調用。如果你習慣於(像我一樣,在編程的早期學習階段)去構建完全符合你需要的內聯腳本,並且如果你再次需要這種操作,那麼你會試着再次弄清楚它 - 好吧,你不習慣這種內部結構來編寫代碼,因爲編譯起來比較複雜,而且閱讀起來不太直觀。但是,這是一個,可能不能有外部調用它的功能,因爲如果沒有它會開始計算和分配變量腳本。如果你試圖重新使用一個函數,那麼很可能你的新腳本與舊腳本的關係足夠緊密,以至於可能存在相互衝突的變量。
我應該說,順便說一句,this thread包含@kindall答案終於讓我明白 - 該幹嘛,而不是如何。不幸的是,它被標記爲this one的重複,我認爲這是一個錯誤。 (我是這個板子的新手,所以不能標記它;如果您同意我的意見,請將其標記爲獲得進一步的注意)
可能的重複http://stackoverflow.com/questions/419163/what-does-if-name-main-do – ozgur
我確實從這裏得到它:(我已經讀了 –
這就像'main(String [] args)'在Java或C# – Radinator