中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何真正理解 if name 的作用

發布時間:2020-05-20 19:57:44 來源:網絡 閱讀:432 作者:Python熱愛者 欄目:編程語言

前言

在 Python 中,我們經常會看到

if__name__?=='__main__':

那么你真的理解此寫法的作用嗎?今天我們就來聊一聊它真正的含義。

筆者最喜歡的就是用示例講明白一個問題,這次也不例外,依然是看例子來說話!

示例說話

舉個例子來說:

有一個物體質量 m=10,g=9.8 (重力參數),求它的重力。

公式:G=m*g

所以創建一個 param.py 的文件,其中代碼如下:


如何真正理解 if name 的作用

在創建一個 sum.py 的文件求 G ,代碼如下:


如何真正理解 if name 的作用

結果如下:


如何真正理解 if name 的作用

結果可以看到,在 param.py 文件中的 main 函數也被執行了,而實際上我們并不希望它被執行,只是想 G 被打印出來即可。

此時?if __name__ == '__main__'?便派上了用場。我們將 param.py 中稍作修改:


如何真正理解 if name 的作用


如何真正理解 if name 的作用

加上后,Pycharm 中多了一個綠色小按鈕,點擊后:

如何真正理解 if name 的作用

可以看到,在 param.py 中加上這么一句話,起到了一個入口函數的作用,也就是說對于 param.py 來說,程序入口是從這里開始的。同時不影響它自身的 g 打印輸出,那么來看下求 G 中的程序。

如何真正理解 if name 的作用

求重力 G 的程序中,我們是沒有改變任何代碼的,可以看到結果已經變了。

結論

if __name__ == '__main__'?相當于 Python 模擬的程序入口。Python 本身并沒有規定這么寫,這只是一種編碼習慣。由于模塊之間相互引用,不同模塊可能都有這樣的定義,而入口程序只能有一個。到底哪個入口程序被選中,這取決于?name?的值。

__name__是內置變量,用于表示當前模塊的名字。

所以,

if __name__ == '__main__'

我們簡單的理解就是:如果本模塊是被直接運行的,則代碼塊被運行,如果本模塊是被導入到其它模塊中去,則處于?name?中的代碼不被運行。

官方文檔

查閱官方文檔可以看到相應的解釋:

如何真正理解 if name 的作用

什么?看不懂,來個中文的!~

如何真正理解 if name 的作用

原文鏈接

https://docs.python.org/3/library/main__.html?highlight=__name

關于 Flask 中的拓展知識

學過 Flask 的同學,可以看下此知識點,沒有學過的也可以了解一下,萬一后續用到了呢,有可能面試中會問到的一個小知識點。

在 Flask 框架中,我們通常使用下面的代碼來進行項目的啟動:


如何真正理解 if name 的作用

上面的代碼是官方給出來的一段最快啟動的小 demo。不難發現,在官方定義的代碼中,入口函數把 app.run() 放在了if __name__ == '__main__'里。

但是有沒有想過為什么要放在里面呢?

正常開發情況下調用 app.run() 啟動,使用的 web 服務器是 Flask 自帶的一個簡單內置服務器。

對于生產環境而言,啟動一個 Flask 項目是不能直接通過 Python 去運行的,因為還面臨著很多問題,比如并發性不好,無法監控項目各指標等。。。

所以在正式的生產環境中,我們是不會使用 Flask 自帶的服務器的,而是通過 nginx + uwsgi 來部署項目。nginx 作為前置服務器,用來接收瀏覽器發來的請求,接著會把請求轉發給 uwsgi ,uwsgi 會以配置文件的形式加載我們寫好的項目,而加載入口則是本地開發環境下的 app.run() 方法所在的入口模塊。就像下圖:

如何真正理解 if name 的作用

于是,在生產環境下, app.run() 所在的模塊相對于 uwsgi 來說便不是入口文件了,它是需要被導入到 uwsgi 中的一個普通模塊。使用if __name__ == '__main__'?的用途就是,不讓 app.run()進行啟動。也就是禁止所謂 Flask 自帶的服務器啟動。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

积石山| 镇安县| 平阳县| 蒲城县| 渭南市| 崇州市| 长宁区| 张家口市| 湄潭县| 乐清市| 青海省| 望奎县| 永川市| 江华| 黄浦区| 饶平县| 杂多县| 闻喜县| 尉氏县| 五指山市| 浙江省| 延津县| 郸城县| 自贡市| 县级市| 易门县| 南溪县| 平塘县| 余干县| 米泉市| 岳池县| 五原县| 定西市| 瑞金市| 广平县| 天峨县| 宁津县| 盐池县| 安宁市| 农安县| 景德镇市|