天天看點

python基礎知識-12-子產品的了解

python其他知識目錄

1、子產品介紹:

Python 子產品(Module),是一個 Python 檔案,以 .py 結尾,包含了 Python 對象定義和Python語句。

子產品讓你能夠有邏輯地組織你的 Python 代碼段。

把相關的代碼配置設定到一個子產品裡能讓你的代碼更好用,更易懂。

子產品能定義函數,類和變量,子產品裡也能包含可執行的代碼。

簡單介紹:

如果你從Python解釋器退出并再次進入,之前的定義(函數和變量)都會丢失。是以,如果你想編寫一個稍長些的程式,最好使用文本編輯器為解釋器準備輸入并将該檔案作為輸入運作。這被稱作編寫 腳本 。随着程式變得越來越長,你或許會想把它拆分成幾個檔案,以友善維護。你亦或想在不同的程式中使用一個便捷的函數, 而不必把這個函數複制到每一個程式中去。

為支援這些,Python有一種方法可以把定義放在一個檔案裡,并在腳本或解釋器的互動式執行個體中使用它們。這樣的檔案被稱作 子產品 ;子產品中的定義可以 導入 到其它子產品或者 主 子產品(你在頂級和電腦模式下執行的腳本中可以通路的變量集合)。

2、子產品類型:

1)内置子產品

  使用方法  直接import導入使用

  在Python的安裝目錄下是内置子產品,比如:C:\python3\Lib

python基礎知識-12-子產品的了解

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

python基礎知識-12-子產品的了解

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("我是魔降風雲變")

python基礎知識-12-子產品的了解
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