python其他知識目錄
1、子產品介紹:
Python 子產品(Module),是一個 Python 檔案,以 .py 結尾,包含了 Python 對象定義和Python語句。
子產品讓你能夠有邏輯地組織你的 Python 代碼段。
把相關的代碼配置設定到一個子產品裡能讓你的代碼更好用,更易懂。
子產品能定義函數,類和變量,子產品裡也能包含可執行的代碼。
簡單介紹:
如果你從Python解釋器退出并再次進入,之前的定義(函數和變量)都會丢失。是以,如果你想編寫一個稍長些的程式,最好使用文本編輯器為解釋器準備輸入并将該檔案作為輸入運作。這被稱作編寫 腳本 。随着程式變得越來越長,你或許會想把它拆分成幾個檔案,以友善維護。你亦或想在不同的程式中使用一個便捷的函數, 而不必把這個函數複制到每一個程式中去。
為支援這些,Python有一種方法可以把定義放在一個檔案裡,并在腳本或解釋器的互動式執行個體中使用它們。這樣的檔案被稱作 子產品 ;子產品中的定義可以 導入 到其它子產品或者 主 子產品(你在頂級和電腦模式下執行的腳本中可以通路的變量集合)。
2、子產品類型:
1)内置子產品
使用方法 直接import導入使用
在Python的安裝目錄下是内置子產品,比如:C:\python3\Lib

2)第三方子產品 https://pypi.org/
使用方法 pip安裝使用詳解
添加pip環境變量
import sys
sys.path.append("C:\python3\Scripts")
print(sys.path)
------------------結果:
['D:\\.........., 'C:\\python3\\Scripts']
如下:剛剛pip安裝的第三方子產品。參考路徑:C:\python3\Lib\site-packages
3)自定義子產品
建立自定義子產品
使用方法
3、子產品導入:
3.1子產品導入的基本了解:
import 語句
子產品的引入
子產品定義好後,我們可以使用 import 語句來引入子產品,文法如下:
import module1[, module2[,... moduleN]]
比如要引用子產品 os,就可以在檔案最開始的地方用 import os 來引入
import os
print(os.path.dirname("c:\mcw_test.py"))
--------------------結果:
c:\
在調用 os 子產品中的函數時,必須這樣引用:
子產品名.函數名
當解釋器遇到 import 語句,如果子產品在目前的搜尋路徑就會被導入。
import os
print(os.path.dirname("/root/mcw_test.py"))
-----------------------結果:、
/root
搜尋路徑是一個解釋器會先進行搜尋的所有目錄的清單。如想要導入子產品 需要把指令放在腳本的頂端:
3.2子產品調用的案例分析
示例一:
有兩個檔案在同級目錄mcw1.py,mokuai.py:
mcw1.py
def func():
print("我是魔降風雲變")
1)
mokuai.py
import mcw1
func()
-----------執行結果:
func()
NameError: name 'func' is not defined
2)
mokuai.py:
import mcw1.func
func()
-----------執行結果:
import mcw1.func
ModuleNotFoundError: No module named 'mcw1.func'; 'mcw1' is not a package
3)
mokuai.py:
import mcw1
mcw1.func() ## 調用子產品中的函數,子產品.函數()
-------------執行結果:
我是魔降風雲變
示例二:
mcw1.py:
def func():
print("我是魔降風雲變")
func()
print("我是mcw1子產品裡的函數")
mokuai.py:
import mcw1
mcw1.func()
--------------執行調用子產品的結果:
我是魔降風雲變
我是mcw1子產品裡的函數
我是魔降風雲變
#代碼分析:結果表明, 導入子產品,加載此子產品中所有的值到記憶體。
示例三:
導入非同一個目錄下的子產品
mcwtest2_dir
dir2_file.py
mcwtest_dir
mcw1.py
mokuai.py
正确正确調用方法:
1)導入某個子產品裡所有函數
import mcwtest_dir.mcw1
mcwtest_dir.mcw1.func()
------------結果:
我是魔降風雲變
2)導入子產品裡單個函數
from mcwtest_dir.mcw1 import func
func()
----------結果:
我是魔降風雲變
3)導入子產品裡多個函數,不是所有函數都導入
from mcwtest_dir.mcw1 import func,func2
func()
func2()
--------------結果:
我是魔降風雲變
我是小馬過河
4)導入子產品裡所有函數。可以導入一個py檔案裡的所有函數,不能導入一個目錄裡的所有py裡的所有函數
from mcwtest_dir.mcw1 import *
func()
func2()
------------結果;
我是魔降風雲變
我是小馬過河
5)重新定義函數,因為導入其它子產品裡的函數是先執行那個函數的,在本檔案重新定義func後,覆寫了那個子產品下定義的函數
from mcwtest_dir.mcw1 import func
def func():
print("重新定義func函數")
func()
-------------結果:
重新定義func函數
def func(): #導入放在下面,就覆寫了本檔案下定義的同名函數
print("重新定義func函數")
from mcwtest_dir.mcw1 import func
func()
--------------結果:
我是魔降風雲變
6)如果本檔案有定義同名函數,從外面子產品導入的同名函數也需要,可以給導入進來的函數加個别名
from mcwtest_dir.mcw1 import func as f
def func():
print("重新定義func函數")
func()
f()
-------------結果:
重新定義func函數
我是魔降風雲變
7)添加檔案的父目錄到sys.path,父目錄已經在sys.path裡。導入時可以直接從檔案裡面導入函數
因為C:\mcw\已經在sys.path裡,所有查詢子產品能找到C:\mcw\mcwtest_dir目錄,但是不能找到該目錄下的檔案,隻有将這個檔案加入到sys.path裡才能查詢到這個目錄下的檔案。
import sys,os
sys.path.append("C:\mcw\mcwtest_dir")
from mcw1 import func
func()
---------------結果;
我是魔降風雲變
錯誤調用方法:
1)在sys.path裡找不到這個函數,隻能一層一層的找。
mcwtest2_dir\dir2_file.py
import mcw1
func()
------結果;
import mcw1
ModuleNotFoundError: No module named 'mcw1'
2)差上級目錄,隻有在根目錄mcw下才能找到,因為隻有mcw在sys.path清單裡。
import mcwtest_dir.mcw1
mcw1.func()
-----------結果:
mcw1.func()
NameError: name 'mcw1' is not defined
3)差函數名調用func()
import mcwtest_dir.mcw1
mcwtest_dir.mcw1()
--------------------結果:
mcwtest_dir.mcw1()
TypeError: 'module' object is not callable
4) 差一層mcw1檔案名
import mcwtest_dir.mcw1
mcwtest_dir.func()
----------------結果:
mcwtest_dir.func()
AttributeError: module 'mcwtest_dir' has no attribute 'func'
導入子產品:
import 子產品 子產品.函數()
from 子產品 import 函數 函數() 【as起别名 / *】
from 子產品 import 函數 as 别名 别名()
導入的另一個示例:
1)
import mcwtest_dir.mcw1
mcwtest_dir.mcw1.func()
2)
from mcwtest_dir import mcw1
mcw1.func()
3)
from mcwtest_dir.mcw1 import func
func()
----------結果:
我是魔降風雲變
總結
子產品和要執行的py檔案在同一目錄 且 需要 子產品中的很多功能時,推薦用: import 子產品 $子產品.函數
其他推薦:from 子產品 import 子產品 $子產品.函數()
其他推薦:from 子產品.子產品 import 函數 $函數()
3.3 sys.path可添加也可删除
import sys
print(sys.path[0])
--------結果;
C:\mcw\mcwtest2_dir
import sys
print(sys.path[0])
sys.path.pop(0)
print(sys.path) #sys.path裡沒有了C:\mcw\mcwtest2_dir,導入子產品需要加上目錄了。
-----------------結果:
C:\mcw\mcwtest2_dir
['C:\\mcw', 'C:\。。。。。\\pycharm_matplotlib_backend']
4、搜尋路徑
當你導入一個子產品,Python 解析器對子產品位置的搜尋順序是:
1、目前目錄
2、如果不在目前目錄,Python 則搜尋在 shell 變量 PYTHONPATH 下的每個目錄。
3、如果都找不到,Python會察看預設路徑。UNIX下,預設路徑一般為/usr/local/lib/python/。
子產品搜尋路徑存儲在 system 子產品的 sys.path 變量中。變量裡包含目前目錄,PYTHONPATH和由安裝過程決定的預設目錄。
import sys
print(sys.path)
--------------------------結果:
[root@xiaoma ~]# python 1.py
['/root', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages/cloud_init-0.7.6-py2.7.egg', '/usr/lib/python2.7/site-packages/itchat-1.3.10-py2.7.egg']
import sys
print(sys.path)
---------------------結果:
['D:\\aPython_full目錄\\小馬過河的代碼練習', 'C:\\mcw', 'C:\\mcw\\venv\\Scripts\\python36.zip', 'C:\\python3\\DLLs', 'C:\\python3\\lib', 'C:\\python3', 'C:\\mcw\\venv', 'C:\\mcw\\venv\\lib\\site-packages', 'C:\\mcw\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg', 'C:\\mcw\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg', 'C:\\軟體安裝\\PyCharm 2018.3.5\\helpers\\pycharm_matplotlib_backend']
5、dir()函數
dir() 函數一個排好序的字元串清單,内容是一個子產品裡定義過的名字。
傳回的清單容納了在一個子產品裡定義的所有子產品,變量和函數。如下一個簡單的執行個體:
6)dir()
dir() 函數不帶參數時,傳回目前範圍内的變量、方法和定義的類型清單;帶參數時,傳回參數的屬性、
方法清單。如果參數包含方法__dir__(),該方法将被調用。如果參數不包含__dir__(),
該方法将最大限度地收集參數資訊。
複制代碼
import sys,os
print(dir(os))
----------------結果:
['DirEntry', 'F_OK', 'MutableMapping', 'O_APPEND', 'O_BINARY', 'O_CREAT', 'O_EXCL', 'O_NOINHERIT', 'O_RANDOM', 'O_RDONLY', 'O_RDWR', 'O_SEQUENTIAL', 'O_SHORT_LIVED', 'O_TEMPORARY', 'O_TEXT', 'O_TRUNC', 'O_WRONLY', 'P_DETACH', 'P_NOWAIT', 'P_NOWAITO', 'P_OVERLAY', 'P_WAIT', 'PathLike', 'R_OK', 'SEEK_CUR', 'SEEK_END', 'SEEK_SET', 'TMP_MAX', 'W_OK', 'X_OK', '_Environ', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_execvpe', '_exists', '_exit', '_fspath', '_get_exports_list', '_putenv', '_unsetenv', '_wrap_close', 'abc', 'abort', 'access', 'altsep', 'chdir', 'chmod', 'close', 'closerange', 'cpu_count', 'curdir', 'defpath', 'device_encoding', 'devnull', 'dup', 'dup2', 'environ', 'errno', 'error', 'execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe', 'extsep', 'fdopen', 'fsdecode', 'fsencode', 'fspath', 'fstat', 'fsync', 'ftruncate', 'get_exec_path', 'get_handle_inheritable', 'get_inheritable', 'get_terminal_size', 'getcwd', 'getcwdb', 'getenv', 'getlogin', 'getpid', 'getppid', 'isatty', 'kill', 'linesep', 'link', 'listdir', 'lseek', 'lstat', 'makedirs', 'mkdir', 'name', 'open', 'pardir', 'path', 'pathsep', 'pipe', 'popen', 'putenv', 'read', 'readlink', 'remove', 'removedirs', 'rename', 'renames', 'replace', 'rmdir', 'scandir', 'sep', 'set_handle_inheritable', 'set_inheritable', 'spawnl', 'spawnle', 'spawnv', 'spawnve', 'st', 'startfile', 'stat', 'stat_float_times', 'stat_result', 'statvfs_result', 'strerror', 'supports_bytes_environ', 'supports_dir_fd', 'supports_effective_ids', 'supports_fd', 'supports_follow_symlinks', 'symlink', 'sys', 'system', 'terminal_size', 'times', 'times_result', 'truncate', 'umask', 'uname_result', 'unlink', 'urandom', 'utime', 'waitpid', 'walk', 'write']
參考連結:
1)http://www.runoob.com/python/python-modules.html
2)https://docs.python.org/zh-cn/3.7/tutorial/modules.html