日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
寫(xiě)Python腳本,一定要加上這個(gè)!

但是,我最近發(fā)現(xiàn)了一個(gè)以前不曾察覺(jué)的問(wèn)題,就是腳本里面是否添加 if __name__ == "__main__":
這個(gè)語(yǔ)句,對(duì)腳本的使用其實(shí)是有很大影響的,并且這里面還有很大的學(xué)問(wèn)。

城中ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!

常見(jiàn)誤區(qū)

很多朋友在寫(xiě)腳本時(shí)比較隨意,簡(jiǎn)單的腳本直接一溜寫(xiě)下來(lái),沒(méi)有函數(shù),順序執(zhí)行。復(fù)雜點(diǎn)的腳本,可能會(huì)加函數(shù)。這種寫(xiě)法可讀性比較差,經(jīng)常讓人一眼找不到程序運(yùn)行的入口和順序。

而 Python 社區(qū)比較推薦的寫(xiě)法是在寫(xiě)腳本時(shí),加上下面這個(gè)語(yǔ)句:

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

if __name__ == "__main__":
main()

大多數(shù)人看到這里,會(huì)不會(huì)說(shuō),這有什么,加不加這個(gè)沒(méi)那么重要吧!

先不要忙著不屑,讓我們一起來(lái)仔細(xì)掰扯掰扯!

有什么用

在具體說(shuō)明 if __name__ == '__main__' 的作用前,先從一個(gè)簡(jiǎn)單的實(shí)例直觀上感受一下。

# 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 的運(yùn)行結(jié)果:

PI: 3.14
round area: 12.56

的 PI 變量,在運(yùn)行的時(shí)候,const.py 中函數(shù) train()
中的打印也帶過(guò)來(lái)了,而我們只是引用變量,并沒(méi)有引用函數(shù),所以這是我們不愿意看到的。

解決這個(gè)問(wèn)題的方法也很簡(jiǎn)單,我們只需在 const.py 中加上一句:

PI = 3.14

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

if __name__ == "__main__":
train()

再次運(yùn)行 area.py ,輸出結(jié)果如下:

round area:  12.56

這是我們預(yù)期的結(jié)果。

程序運(yùn)行入口

叢上述實(shí)例可以發(fā)現(xiàn),如果沒(méi)有 if __name__=="__main__": ,作為 area.py 導(dǎo)入文件時(shí) const.py
中的所有代碼都被執(zhí)行了,而加上之后就只運(yùn)行導(dǎo)入的部分代碼。

這就是 if __name__=="__main__": 顯而易見(jiàn)的作用,實(shí)際上 if __name__=="__main__": 就相當(dāng)于是
Python 模擬的程序入口。由于模塊之間相互引用,不同模塊可能都有這樣的定義,而入口程序只能有一個(gè),選中哪個(gè)入口程序取決于 __name__ 的值。

我們?cè)賮?lái)看一個(gè)小程序:

print("look here")
print(__name__)

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

程序的運(yùn)行結(jié)果如下:

look here
__main__
I'm test.py

可以發(fā)現(xiàn),此時(shí)變量 __name__ 的值為 __main__,所以打印 “I'm
test.py”。如果運(yùn)行其他文件,通過(guò)運(yùn)行的文件調(diào)用本文件,則不會(huì)打印該語(yǔ)句,因?yàn)槌绦蛉肟诓粚?duì),該語(yǔ)句不執(zhí)行。

代碼規(guī)范

有了 if __name__=="__main__": 相當(dāng)于 Python
程序也有了一個(gè)入口函數(shù),我們可以清晰的知道程序的邏輯開(kāi)始于何處,當(dāng)然還需要我們自覺(jué)的把程序的開(kāi)始邏輯都放在這里。其實(shí),這也是 PyCharm
推薦的作法。

為什么很多優(yōu)秀的編程語(yǔ)言,比如 C、Java、Golang、C++ 都有一個(gè) main
入口函數(shù)呢?我想很重要的一個(gè)原因就是就是程序入口統(tǒng)一,容易閱讀。

多進(jìn)程場(chǎng)景大作用

如果你用多進(jìn)程來(lái)做并行計(jì)算,類(lèi)似這樣的代碼:

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)

運(yùn)行這段代碼,控制臺(tái)會(huì)一直打印:


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

并且程序會(huì)不停的報(bào)錯(cuò) RuntimeError。

如果你加上了 if __name__=="__main__": ,程序就會(huì)按照預(yù)期的進(jìn)行:

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 的多程序就是啟動(dòng)了多個(gè) Python 解器器,每個(gè) Python 解釋器都會(huì)導(dǎo)入你這個(gè)腳本,復(fù)制一份全局變量和函數(shù)給子進(jìn)程用,如果有了 if
__name__=="__main__":,那它后面的代碼就不會(huì)被 import,也就不會(huì)被重復(fù)執(zhí)行。否則,這個(gè)創(chuàng)建多進(jìn)程的代碼就會(huì)被
import,就會(huì)被執(zhí)行,從而無(wú)限遞歸的去創(chuàng)建子進(jìn)程

總結(jié)

if __name__=="__main__": 雖然不是強(qiáng)制的,但是我強(qiáng)列推薦你寫(xiě)腳本時(shí)按照這個(gè)規(guī)范來(lái)做。


分享文章:寫(xiě)Python腳本,一定要加上這個(gè)!
文章來(lái)源:http://www.dlmjj.cn/article/cddphjd.html