首頁 >後端開發 >Python教學 >寫 Python 腳本,一定要加這個!

寫 Python 腳本,一定要加這個!

PHPz
PHPz轉載
2023-04-14 19:40:011396瀏覽

使用 Python 的人,平常常常會寫一些腳本,不管是為了提升工作效率,還是為了滿足一些特定的需求,Python 腳本都是一個常見又有用的東西。

但是,我最近發現了一個以前不曾察覺的問題,就是腳本裡面是否添加if __name__ == "__main__":
這個語句,對腳本的使用其實是有很大影響的,而且這裡面還有很大的學問。

常見誤解

很多朋友在寫腳本時比較隨意,簡單的腳本直接一溜寫下來,沒有函數,順序執行。複雜點的腳本,可能會加函數。這種寫法可讀性比較差,常常讓人一眼找不到程式運行的入口和順序。

而Python 社群比較推薦的寫法是在寫腳本時,加上下面這個語句:

def main():
# do something
print("do something.")

if __name__ == "__main__":
main()

大多數人看到這裡,會不會說,這有什麼,加不加這個沒那麼重要吧!

先不要忙著不屑,讓我們一起來仔細掰扯掰扯!

有什麼用

在具體說明if __name__ = = '__main__' 的作用前,先從一個簡單的實例直觀上感受一下。

# const.py
 
PI = 3.14
 
def train():
print("PI:", PI)
 
train()
# area.py
 
from const import PI
 
def calc_round_area(radius):
return PI * (radius ** 2)
 
def calculate():
print("round area: ", calc_round_area(2))
 
calculate()

我們看下area.py 的運行結果:

PI: 3.14
round area:12.56

的PI 變量,在運行的時候,const.py 中函數train()
中的打印也帶過來了,而我們只是引用變量,並沒有引用函數,所以這是我們不願意看到的。

解決這個問題的方法也很簡單,我們只要在const.py 中加上一句:

PI = 3.14

def train():
 print("PI:", PI)

if __name__ == "__main__":
 train()

再次執行area.py ,輸出結果如下:

round area:12.56

這是我們預期的結果。

程式運行入口

叢上述實例可以發現,如果沒有if __name__=="__main__": ,作為area.py 導入文件時const.py
中的所有代碼都被執行了,而加上之後就只執行導入的部分程式碼。

這就是 if __name__=="__main__": 顯而易見的作用,實際上 if __name__=="__main__": 就相當於是
Python 模擬的程式入口。由於模組之間相互引用,不同模組可能都有這樣的定義,而入口程式只能有一個,選取哪個入口程式取決於 __name__ 的值。

我們再來看一個小程式:

print("look here")
print(__name__)
 
if __name__ == '__main__':
print("I'm test.py")

程式的執行結果如下:

look here
__main__
I'm test.py

可以發現,此時變數__name__ 的值為__main__,所以印出“I'm
test.py”。如果執行其他文件,透過執行的文件呼叫本文件,則不會列印該語句,因為程式入口不對,該語句不執行。

程式碼規範

有了if __name__=="__main__": 相當於Python
程式也有了一個入口函數,我們可以清晰的知道程式的邏輯開始於何處,當然還需要我們自覺的把程式的開始邏輯都放在這裡。其實,這也是 PyCharm
推薦的做法。

為什麼很多優秀的程式語言,像是C、Java、Golang、C 都有一個main
入口函數呢?我想很重要的一個原因就是程式入口統一,容易閱讀。

多進程場景大作用

如果你用多進程來做並行計算,類似這樣的程式碼:

import multiprocessing as mp

def useful_function(x):
return x * x

print("processing in parallel")
with mp.Pool() as p:
results = p.map(useful_function, [1, 2, 3, 4])
print(results)

運行這段程式碼,控制台會一直印出:

processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel
processing in parallel

且程式會不停的報錯RuntimeError。

如果你加上了if __name__=="__main__": ,程式就會按照預期的進行:

import multiprocessing as mp

def useful_function(x):
return x * x

if __name__ == '__main__':
print("processing in parallel")
with mp.Pool() as p:
results = p.map(useful_function, [1, 2, 3, 4])
print(results)

Python 的多程式就是啟動了多個Python 解器器,每個Python 解釋器都會導入你這個腳本,複製一份全域變數和函數給子程序用,如果有了if
__name__=="__main__":,那它後面的程式碼就不會被import,也就不會重複執行。否則,這個創建多進程的程式碼就會被
import,就會被執行,從而無限遞歸的去創建子進程

##總結

if __name__==" __main__": 雖然不是強制的,但是我強列推薦你寫腳本時按照這個規範來做。

以上是寫 Python 腳本,一定要加這個!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除