成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

使用 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技術
相關推薦

2021-10-29 06:56:15

Python腳本解釋器

2014-10-29 14:52:13

程序員

2022-10-17 06:22:36

Anaconda開源

2020-10-27 10:58:07

Linux內核操作系統

2010-11-19 16:02:42

IT族

2018-09-11 10:57:53

CIOCAOBI

2016-01-13 10:24:27

2023-05-16 14:07:52

AI自然語言

2022-02-18 12:24:39

PythonNumpy Arra大數據

2021-03-05 11:02:14

iOS 14.5蘋果更新

2011-11-09 14:54:50

Linux操作系統

2022-08-31 22:50:13

JavaScript函數JSON

2018-04-16 09:31:17

2021-05-18 11:40:11

開源腳本工具

2011-05-10 15:51:34

SEO

2022-06-13 09:26:41

Promise前端代碼

2020-08-19 10:11:36

SQLMySQL數據庫

2023-09-26 07:43:22

工具骨架屏頁面

2025-05-26 01:10:00

JSON開發數據

2021-12-03 12:35:50

new[]delete[]語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美视频 | 天堂在线中文字幕 | 毛片网站在线观看 | 久久看精品 | 中文字幕欧美一区 | 久久久久久精 | 国产精品无码久久久久 | 国产成人精品一区二区三区在线 | 精品国产乱码久久久久久丨区2区 | 91精品国产综合久久久久久丝袜 | 一道本视频 | 久久精品中文 | 国产清纯白嫩初高生在线播放视频 | 一区二区在线观看免费视频 | 国产精品久久久久久妇女6080 | 久久国产精品一区二区三区 | 中文在线日韩 | 久久久久久久久国产成人免费 | 91免费小视频 | 日韩av啪啪网站大全免费观看 | 美女爽到呻吟久久久久 | 久久久精彩视频 | 美女福利视频 | 国产区一区二区三区 | 国产精品久久久久久久久久久久冷 | 精品二区视频 | 天天爽天天操 | 国产在线一区二区 | 嫩草视频在线 | 精品在线看 | 91视频大全 | 精品1区| 国产麻豆一区二区三区 | 国产精品国产三级国产aⅴ中文 | 国产精品久久二区 | 亚洲精品久久久久久一区二区 | 欧美日韩在线国产 | 免费看色| 国产精品成人一区二区三区 | 精品精品视频 | 一级美国黄色片 |