系列
- Python: 學習系列之一:Python能做什麼
- Python: 學習系列之二:基礎介紹(int/float/string/range/list/tuple/dict/set)
- Python: 學習系列之三:基礎介紹二
- Python: 學習系列之四:有趣的經典數學問題
- Python: 學習系列之五:類、繼承、多態、封裝
- Python: 學習系列之六:對象的內置函數及類對象的特殊方法
- Python: 學習系列之七:模塊、PIPY及Anaconda
- Python: 學習系列之八:異常的處理
- Python: 學習系列之九:文件讀寫
- Python: 學習系列之十:函數
什麼是模塊
- 一個.py文件就是一個模塊
- 在模塊中可以定義變量、函數、類等,它們統稱爲模塊的屬性
什麼是包
- 爲了更好的組織和管理模塊, Python引入了包
- 在某個目錄下添加模塊__init__.py之後,該目錄就變成了包,因爲包是包含特定模塊的特殊目錄
- 模塊__init__.py的作用是初始化所在的包。如果不需要初始化,其內容可以爲空。
- 目錄支持嵌套,所以包也支持嵌套,包可以包含子包
如何導入模塊
當輸入"[包名.]模塊名."之後,在代碼提示中,變量用黃色的v(variable)表示,函數用粉色的f(function)表示,類用藍色的c( class)表示。
-
導入整個模塊
""" 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)
-
導入模塊中的屬性
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以及一大堆安裝好的工具包,比如:numpy、pandas等,Miniconda包括Conda、Python。
- 訪問https://www.anaconda.com安裝Anaconda
- 安裝完成後,會自動將Anaconda安裝目錄下的bin目錄添加到系統環境變量PATH中,它會使用自帶的python,安裝第三方庫會被安裝到Anaconda安裝目錄下
- 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, 這裏依然可以訪問到