Python3學習筆記(18)----模塊知識點總結

1、Python 中的 if __name__ == '__main__'

對於很多編程語言來說,程序都必須要有一個入口,比如 C,C++,以及完全面向對象的編程語言 Java,C# 等。如果你接觸過這些語言,對於程序入口這個概念應該很好理解,C 和 C++ 都需要有一個 main 函數來作爲程序的入口,也就是程序的運行會從 main 函數開始。同樣,Java 和 C# 必須要有一個包含 Main 方法的主類來作爲程序入口。

而 Python 則有不同,它屬於腳本語言,不像編譯型語言那樣先將程序編譯成二進制再運行,而是動態的逐行解釋運行。也就是從腳本第一行開始運行,沒有統一的入口。

一個 Python 源碼文件除了可以被直接運行外,還可以作爲模塊(也就是庫)被導入。不管是導入還是直接運行,最頂層的代碼都會被運行(Python 用縮進來區分代碼層次)。而實際上在導入的時候,有一部分代碼我們是不希望被運行的。

舉一個例子來說明一下,假設我們有一個 const.py 文件,內容如下:

PI = 3.14

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

main()

我們在這個文件裏邊定義了一些常量,然後又寫了一個 main 函數來輸出定義的常量,最後運行 main 函數就相當於對定義做一遍人工檢查,看看值設置的都對不對。然後我們直接執行該文件(python const.py),輸出:

PI: 3.14

現在,我們有一個 area.py 文件,用於計算圓的面積,該文件裏邊需要用到 const.py 文件中的 PI 變量,那麼我們從 const.py 中把 PI 變量導入到 area.py 中:

from const import PI

def calc_round_area(radius):
    return PI * (radius ** 2)

def main():
    print "round area: ", calc_round_area(2)

main()

運行 area.py,輸出結果:

PI: 3.14
round area:  12.56

可以看到,const 中的 main 函數也被運行了,實際上我們是不希望它被運行,提供 main 也只是爲了對常量定義進行下測試。這時,if name == ‘main’ 就派上了用場。把 const.py 改一下:

PI = 3.14

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

if __name__ == "__main__":
    main()

然後再運行 area.py,輸出如下:

round area:  12.56

再運行下 const.py,輸出如下:

PI: 3.14

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

2、作用域

在一個模塊中,我們可能會定義很多函數和變量,但有的函數和變量我們希望給別人使用,有的函數和變量我們希望僅僅在模塊內部使用。在Python中,是通過_前綴來實現的。

正常的函數和變量名是公開的(public),可以被直接引用,比如:abc,x123,PI等;

類似__xxx__這樣的變量是特殊變量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊變量,我們自己的變量一般不要用這種變量名;

類似_xxx__xxx這樣的函數或變量就是非公開的(private),不應該被直接引用,比如_abc,__abc等;

private函數或變量不應該被別人引用,那它們有什麼用呢?

def _private_1(name):
return 'Hello, %s' % name

def _private_2(name):
    return 'Hi, %s' % name

def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

我們在模塊裏公開greeting()函數,而把內部邏輯用private函數隱藏起來了,這樣,調用greeting()函數不用關心內部的private函數細節,這也是一種非常有用的代碼封裝和抽象的方法,即:

外部不需要引用的函數全部定義成private,只有外部需要引用的函數才定義爲public。

3、安裝第三方模塊

在Python中,安裝第三方模塊,是通過包管理工具pip完成的。

在命令提示符窗口下嘗試運行pip,如果Windows提示未找到命令,可以重新運行安裝程序添加pip。

例如,我們要安裝一個第三方庫——Python Imaging Library,這是Python下非常強大的處理圖像的工具庫。不過,PIL目前只支持到Python 2.7,並且有年頭沒有更新了,因此,基於PIL的Pillow項目開發非常活躍,並且支持最新的Python 3。

一般來說,第三方庫都會在Python官方的pypi.python.org網站註冊,要安裝一個第三方庫,必須先知道該庫的名稱,可以在官網或者pypi上搜索,比如Pillow的名稱叫Pillow,因此,安裝Pillow的命令就是:

pip install Pillow

4、安裝常用模塊

在使用Python時,我們經常需要用到很多第三方庫,例如,上面提到的Pillow,以及MySQL驅動程序,Web框架Flask,科學計算Numpy等。用pip一個一個安裝費時費力,還需要考慮兼容性。我們推薦直接使用Anaconda,這是一個基於Python的數據處理和科學計算平臺,它已經內置了許多非常有用的第三方庫,我們裝上Anaconda,就相當於把數十個第三方模塊自動安裝好了,非常簡單易用。

Anaconda安裝的第三方模塊會安裝在Anaconda自己的路徑下,不影響系統已安裝的Python目錄。

安裝好Anaconda後,重新打開命令行窗口,輸入python,可以看到Anaconda的信息:
可以嘗試直接import numpy等已安裝的第三方模塊。

5、模塊搜索路徑

當我們試圖加載一個模塊時,Python會在指定的路徑下搜索對應的.py文件,如果找不到,就會報錯:

>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named mymodule

默認情況下,Python解釋器會搜索當前目錄、所有已安裝的內置模塊和第三方模塊,搜索路徑存放在sys模塊的path變量中:

>>> import sys
>>> sys.path
['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', ..., '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

如果我們要添加自己的搜索目錄,有兩種方法:

一是直接修改sys.path,添加要搜索的目錄:

>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

這種方法是在運行時修改,運行結束後失效。

第二種方法是設置環境變量PYTHONPATH,該環境變量的內容會被自動添加到模塊搜索路徑中。設置方式與設置Path環境變量類似。注意只需要添加你自己的搜索路徑,Python自己本身的搜索路徑不受影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章