name 是內建變數,它表示的是當前所在模組的名字,同時還能反應乙個包的結構。
a├── b
│ ├── c.py
│ └── __init__.py
└── __init__.py
目錄中所有的py檔案的內容都為:
python(__name__)
模組名其實就是import時,要用到的名字。
如果乙個模組直接被執行,則其沒有包結構。其__name__值就為__main__。
python屬於指令碼語言,不像編譯型語言那樣先將程式編譯成二進位制再執行,而是動態的逐行解釋執行。也就是從指令碼第一行開始執行,沒有統一的入口。
乙個 python
原始碼檔案除了可以被直接執行外,還可以作為模組(也就是庫)被匯入。不管是匯入還是直接執行,最頂層的**都會被執行(python
用縮進來區分**層次)。而實際上在匯入的時候,有一部分**我們是不希望被執行的。
舉乙個例子來說明一下,假設我們有乙個 const.py 檔案,內容如下:
pi = 3.14defmain():
"pi:
", pi
main()
我們在這個檔案裡邊定義了一些常量,然後又寫了乙個 main 函式來輸出定義的常量,最後執行 main 函式就相當於對定義做一遍人工檢查,看看值設定的都對不對。然後我們直接執行該檔案(python const.py),輸出:
pi: 3.14
現在,我們有乙個 area.py 檔案,用於計算圓的面積,該檔案裡邊需要用到 const.py 檔案中的 pi 變數,那麼我們從 const.py 中把 pi 變數匯入到 area.py 中:
from const importpidef
calc_round_area(radius):
return pi * (radius ** 2)
defmain():
"round area:
", calc_round_area(2)
main()
執行 area.py,輸出結果:
pi: 3.14round area: 12.56
可以看到,const 中的 main 函式也被執行了,實際上我們是不希望它被執行,提供 main
也只是為了對常量定義進行下測試。這時,if __name__ == '__main__' 就派上了用場。把 const.py 改一下:
pi = 3.14defmain():
"pi:
", pi
if__name__ == "
__main__":
main()
然後再執行 area.py,輸出如下:
round area: 12.56再執行下 const.py,輸出如下:
pi: 3.14
這才是我們想要的效果。
if __name__ == '__main__' 就相當於是
python 模擬的程式入口。python
本身並沒有規定這麼寫,這只是一種編碼習慣。由於模組之間相互引用,不同模組可能都有這樣的定義,而入口程式只能有乙個。到底哪個入口程式被選中,這取決於 __name__ 的值。
關於Python中的yield
在介紹yield前有必要先說明下python中的迭代器 iterator 和生成器 constructor 一 迭代器 iterator 在python中,for迴圈可以用於python中的任何型別,包括列表 元祖等等,實際上,for迴圈可用於任何 可迭代物件 這其實就是迭代器 迭代器是乙個實現了迭...
關於Python中的yield
在介紹yield前有必要先說明下python中的迭代器 iterator 和生成器 constructor 一 迭代器 iterator 在python中,for迴圈可以用於python中的任何型別,包括列表 元祖等等,實際上,for迴圈可用於任何 可迭代物件 這其實就是迭代器 迭代器是乙個實現了迭...
關於Python中的yield
在介紹yield前有必要先說明下python中的迭代器 iterator 和生成器 constructor 一 迭代器 iterator 在python中,for迴圈可以用於python中的任何型別,包括列表 元祖等等,實際上,for迴圈可用於任何 可迭代物件 這其實就是迭代器 迭代器是乙個實現了迭...