<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2878字,需瀏覽 6分鐘

           ·

          2022-06-02 08:42

          文 |?閑歡

          來源:Python 技術「ID: pythonall」

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

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

          常見誤區(qū)

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

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

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

          if?__name__?==?"__main__":
          ????main()

          大多數(shù)人看到這里,會不會說,這有什么,加不加這個沒那么重要吧!

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

          有什么用

          在具體說明 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 中函數(shù) train() 中的打印也帶過來了,而我們只是引用變量,并沒有引用函數(shù),所以這是我們不愿意看到的。

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

          PI?=?3.14

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

          if?__name__?==?"__main__":
          ???train()

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

          round?area:??12.56

          這是我們預期的結果。

          程序運行入口

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

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

          我們再來看一個小程序:

          #?test.py

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

          程序的運行結果如下:

          look?here
          __main__
          I'm?test.py

          可以發(fā)現(xiàn),此時變量 __name__ 的值為 __main__,所以打印 “I'm test.py”。如果運行其他文件,通過運行的文件調(diào)用本文件,則不會打印該語句,因為程序入口不對,該語句不執(zhí)行。

          代碼規(guī)范

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

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

          多進程場景大作用

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

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

          總結

          if __name__=="__main__": 雖然不是強制的,但是我強列推薦你寫腳本時按照這個規(guī)范來做,它是 Python 社區(qū)的約定,對應Python 之禪:明確優(yōu)于隱晦。

          如果你覺得本文對你有幫助,還請點個贊支持一下,比心~

          往期推薦
          1、Python 3.11 ,即將變得更快!
          2、如何只用一行Python代碼制作一個GUI(圖形界面)?
          3、Python實戰(zhàn)之將頭像轉成動漫風
          4、用Python做游戲有多簡單
          5、Python代碼自動轉成其他編程語言代碼
          點擊關注公眾號,閱讀更多精彩內(nèi)容
          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品片 | 热国产中文网 | 午夜视频偷拍网址 | a√在线看 | 亚洲高清网站 |