Python: 學習系列之七:模塊、PIPY及Anaconda

系列

什麼是模塊

  • 一個.py文件就是一個模塊
  • 在模塊中可以定義變量、函數、類等,它們統稱爲模塊的屬性

什麼是包

  • 爲了更好的組織和管理模塊, Python引入了包
  • 在某個目錄下添加模塊__init__.py之後,該目錄就變成了包,因爲包是包含特定模塊的特殊目錄
  • 模塊__init__.py的作用是初始化所在的包。如果不需要初始化,其內容可以爲空。
  • 目錄支持嵌套,所以包也支持嵌套,包可以包含子包

如何導入模塊

當輸入"[包名.]模塊名."之後,在代碼提示中,變量用黃色的v(variable)表示,函數用粉色的f(function)表示,類用藍色的c( class)表示。

  1. 導入整個模塊

    """
        import [包名.]模塊名
        from 包名 import 模塊名
    
    """
    
    import os
    
    print(os.environ)
    
    print(os.getenv('JAVA_HOME'))
    
    print(os.MutableMapping)
    
    import xml.dom.minidom as n
    
    print(xml.dom.minidom.StringTypes)
    
    print(n.StringTypes)
  2.  導入模塊中的屬性

    from os import getenv, environ
    from os import MutableMapping as m
    from os import * #導入了所有的屬性,不推薦
    
    print(m)
    print(getenv('JAVA_HOME'))  # <class 'collections.abc.MutableMapping'>
    print(m)  # <class 'collections.abc.MutableMapping'>

使用當前項目中的模塊

    1. 直接導入

    2.相對導入, 一個. 表示當前目錄,兩個..表示當前目錄的父目錄

        注意:當直接運行某個模塊時,該 模塊就變成了主模塊,主模塊位於最頂層,與同目錄下的其它模塊無法構成相對關係,因此,當直接運行某個模塊時,該模塊不能使用相對導入。

PIPY簡介

PYPI的全稱是:Python Package Index,它是Python官方的、基於WEB的、集中管理的、第三方的軟件倉庫。https://pypi.org

如何導入第三方庫

如果要使用第三方庫,必須先使用工具pip或pip3

# 看到如下界面,說明pip 安裝好了
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip

Usage:
  pip <command> [options]

# 版本號
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip --version
pip 19.1.1 from c:\python37\lib\site-packages\pip (python 3.7)

#安裝某個模塊
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install requests

#安裝指定版本某個模塊
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install requests==1.20.1

#卸載某個模塊
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip uninstall requests

#升級某個模塊
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install --upgrade requests

#模糊查找某個模塊
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip search requests

#列出所有已安裝的第三方庫
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip list

Anaconda

Anaconda是一個開源的包、環境管理器,可以用於在同一個機器上安裝不同版本的軟件包及其依賴,並能夠在不同的環境之間切換,Anaconda包括Conda、Python以及一大堆安裝好的工具包,比如:numpypandas等,Miniconda包括Conda、Python。

  1. 訪問https://www.anaconda.com安裝Anaconda
  2. 安裝完成後,會自動將Anaconda安裝目錄下的bin目錄添加到系統環境變量PATH中,它會使用自帶的python,安裝第三方庫會被安裝到Anaconda安裝目錄下
  3. Anaconda的第三方庫管理工具conda, 類似於工具pip3. 相關命令如下:
#查看幫助信息
conda

# 查看已安裝第三方庫
conda list

# 搜索第三方庫
conda search XXX

# 安裝第三方庫
conda install XXX

conda install XXX=1.1  #這裏只有一個等號

# 升級第三方庫
conda update XXX

# 卸載第三方庫
conda remove XXX

PYC字節碼文件

模塊第一次被導入時,它會被編譯爲PYC字節碼文件。pyc字節碼文件存放在與該模塊同目錄下的目錄__pycache__中。

運行被導入的模塊

導入包中的模塊時,會先導入包中的 __init__.py,因此,在運行被導入的模塊之前,會從最頂層的父包開始,先依次運行所有的父包中的__init_.py。

查看模塊中的所有屬性

import mod1

print(dir(mod1))  #查看被引入模塊的所有屬性 

print(dir())  # 查看當前模塊的所有屬性

如何重新加載已經被導入的模塊

在交互式命令行中,使用import語句導入某個模塊後,如果對該模塊做了修改,然後再次使用import語句導入該模塊,那麼對模塊的修改不會起任何作用。可以調用標準庫函數reload重新加載已經被導入的模塊。

但在程序中,即.py文件中,不會出現上述的問題。

PS C:\Users\cong.wu\Desktop\Test\packageDemo> python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod1
>>> mod1.v
14
#對mod1進行修改,將v改成15
>>> import mod1
>>> mod1.v
14 #可以看到這裏結果依然是14

>>> import importlib
>>> importlib.reload(mod1) #重新加載後
<module 'mod1' from 'C:\\Users\\cong.wu\\Desktop\\Test\\packageDemo\\mod1.py'>
>>> mod1.v
15

模塊的特殊屬性之__doc__

"""
    模塊的特殊屬性之__doc__
"""

print(__doc__)  # 模塊的特殊屬性之__doc__

模塊的特殊屬性之__ name__

"""
    1. 對於被導入的模塊,其特殊屬性__name__的值爲模塊名
    2. 對於直接運行的模塊,其特殊屬性__name__的值爲__main__
"""

import mod1

print(__name__)  # __main__
print(mod1.__name__)  # mod1


"""
    可以根據__name__的值來判斷是否執行模塊中的測試代碼,對於模塊中的測試代碼,通常當直接運行模塊時才需要執行,
    而當模塊被導入時則不需要執行。
"""

def add(num1: int, num2: int):
    print('the result is %i' % (num1+num2))

"""
    只有當前模塊直接運行時,纔會運行如下代碼,如果模塊被引用,下面這段代碼不會被執行
"""
if __name__ == '__main__':
    add(1, 2)

模塊內的數據訪問控制之單下劃線 "_"

"""
    模塊的屬性前面加單下劃線_ , 這樣就無法使用語句"from 模塊名 import *"導入相當的屬性
    但使用語句"import 模塊名"依然可以導入所有的屬性。
"""

from mod1 import *

print(v)  # 15

print(_v)  # NameError: name '_v' is not defined

import mod1
print(v) # 15
print(_v)  # 15

模塊內的數據訪問控制之特殊屬性__all__

"""
    可以在模塊內定義特殊屬性__all__.這樣,可以使用語句"from 模塊名 import *"導入特殊屬性__all__中定義的屬性
    但使用語句"import 模塊名"依然可以導入所有的屬性。
    __all__的優先級高於下劃線。
"""

"""
    mod1.py

    __all__=['v','_v']
    v=15
    _v=15
"""

from mod1 import *

print(v)  # 15
print(_v)  # 15, 這裏依然可以訪問到

 

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