1、python3模塊
模塊是一個包含所有你定義的函數和變量的文件,其后綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數等功能。這也是使用 python 標准庫的方法。
模塊讓你能夠有邏輯地組織你的python代碼段;把相關的代碼分配到一個模塊里能讓你的代碼更好用,更易懂。
模塊能定義函數,類和變量,模塊里也能包含可執行的代碼。
#新建模塊文件modle_1.py,內容如下: def p_func(arg): print('hello',arg) return #新建主模塊文件main.py,內容如下: from modle_1 import p_func #導入模塊modle_1中的p_func函數 if __name__ == "__main__": #判斷是否為主程序執行口 p_func('python') #output: hello python
2、模塊的引入
模塊定義好后,可以使用import語句來引入模塊,語法如下:
import module1,[module2[,.........moduleN]]
比如要引用模塊math,就可以在文件最開始用import math來引入,在調用math模塊中的函數時,必須使用:模塊名.函數名,來使用函數。
一個模塊只會被導入一次,不管執行了多少次import,這樣可以防止導入模塊被重復執行。
from ... import語句:
python中的from語句讓你從模塊中導入一個指定的部分到當前命名空間中,語法如下:
from modname import name1,name2..........nameN
from mod import func_1 #導入mod模塊中的func_1函數
這個聲明不會把整個mod模塊導入到當前命名空間中,它只會將mod里的func_1單個引入到執行這個聲明的模塊的全局符號表。
from ... import * :這樣會把模塊中的所有內容導入到當前命名空間,一般不建議使用,消耗內存空間,也容易出現未預知的問題。
3、搜索路徑
當導入一個模塊后,python解析器對模塊位置的搜索順序是:
當前目錄----shell變量PYTHONPATH下的每個目錄----------python模塊路徑目錄
模塊的搜索路徑存儲在system模塊的sys.path變量中,包括當前目錄,pythonpath和安裝過程決定的默認目錄。
>>> import sys >>> print(sys.path) ['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages']
其中的空字符串表示當前工作目錄,當安裝第三方模塊的時候,如果不是按照標准方式安裝,則為了能夠引用這些模塊,必須將這些模塊的安裝路徑添加到sys.path中,有以下幾種方法:
1)最簡單的方法,是在sys.path的某個目錄下添加路徑配置文件,最常見的就是在..../site-package/目錄下,路徑配置文件的擴展名為'.pth',其中的每一行包含一個單獨的路徑,該路徑會添加到sys.path列表中,“.pth”中的路徑可以是絕對路徑也可以是相對路徑,如果是相對路徑則相對於包含".pth"文件的路徑而言的。
>>> import sys >>> print(sys.path) #默認搜索路徑 ['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages'] [root@python site-packages]# vim /media/aa.py #在site-packages下新建配置文件system.th內容為需要添加的模塊路徑 [root@python site-packages]# cat system.pth /media #在/media目錄下新建模塊aa.py [root@python site-packages]# cat /media/aa.py def munit(x,y): print('sun:',x+y) return x+y >>> sys.path ['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages', '/media'] #默認路徑下增加了一個/media搜索路徑 >>> import aa #導入模塊aa >>> aa.munit(1,2) #執行模塊中的函數 sun: 3 3
2)另一種方法就是在Python標准庫中修改site.py文件,並編輯sys.path。除非使用了-S開關選項,否則site.py在Python解釋器加載時會自動被引入(執行),作用是加載site-packages中的包和模塊到python的sys.path里面。所以,可以編輯site.py,然后加上下面的兩行內容即可:
>>> import aa Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named 'aa' >>> import sys >>> sys.path ['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages'] >>> import sys >>> sys.path.append("/media") #添加模塊路徑到搜索路徑中 >>> sys.path ['', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages', '/media'] >>> import aa >>> aa.munit(2,3) sun: 5 5
3)修改PYTHONPATH環境變量,一般不推薦使用此方法。
set PYTHONPATH =/usr/local/lib/python
4、命名空間和作用域
變量是擁有匹配對象的名字(標識符)。命名空間是一個包含了變量名稱們(鍵)和它們各自相應的對象們(值)的字典。
一個 Python 表達式可以訪問局部命名空間和全局命名空間里的變量。如果一個局部變量和一個全局變量重名,則局部變量會覆蓋全局變量。
每個函數都有自己的命名空間。類的方法的作用域規則和通常函數的一樣。
Python 會智能地猜測一個變量是局部的還是全局的,它假設任何在函數內賦值的變量都是局部的。
因此,如果要給函數內的全局變量賦值,必須使用 global 語句。
global VarName 的表達式會告訴 Python, VarName 是一個全局變量,這樣 Python 就不會在局部命名空間里尋找這個變量了。
例如,我們在全局命名空間里定義一個變量 Money。我們再在函數內給變量 Money 賦值,然后 Python 會假定 Money 是一個局部變量。然而,我們並沒有在訪問前聲明一個局部變量 Money,結果就是會出現一個 UnboundLocalError 的錯誤。取消 global 語句的注釋就能解決這個問題。
Money = 2000 #定義全局變量 def addmoney(): #global Money Money = Money +1 #函數內不能直接調用全局變量,必須用global來聲明全局變量 print(Money) addmoney() print(Money)
5、dir()函數
dir() 函數一個排好序的字符串列表,內容是一個模塊里定義過的名字。
返回的列表容納了在一個模塊里定義的所有模塊,變量和函數。
import TEST print(TEST.add(8,9)) con = dir(TEST) print(con) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add'] #特殊字符串變量__name__指向模塊的名字,__file__指向該模塊的導入文件名,add為函數名。
6、globals()和locals()函數
根據調用地方的不同,globals() 和 locals() 函數可被用來返回全局和局部命名空間里的名字。
如果在函數內部調用 locals(),返回的是所有能在該函數里訪問的命名。
如果在函數內部調用 globals(),返回的是所有在該函數里能訪問的全局名字。
兩個函數的返回類型都是字典。所以名字們能用 keys() 函數摘取。
7、reload() 函數
當一個模塊被導入到一個腳本,模塊頂層部分的代碼只會被執行一次。
因此,如果你想重新執行模塊里頂層部分的代碼,可以用 reload() 函數。該函數會重新導入之前導入過的模塊。
8、python中的包
包是一個分層次的文件目錄結構,它定義了一個由模塊及子包,和子包下的子包等組成的 Python 的應用環境。
簡單來說,包就是文件夾,但該文件夾下必須存在 __init__.py 文件, 該文件的內容可以為空。__int__.py用於標識當前文件夾是一個包。
#首先在根目錄下創建兩個目錄,分別創建模塊aa,bb [root@python media1]# ls /media/ aa.py __pycache__ [root@python media1]# ls /media1/ bb.py __pycache__ #在aa和bb模塊下創建函數: [root@python media1]# cat /media/aa.py def munit(x,y): print('sun:',x+y) return x+y [root@python media1]# cat /media1/bb.py def mule(x,y): return x**y #調用模塊 [root@python ~]# cat init.py import sys sys.path.append("/media") from aa import munit print(sys.path) s = munit(3,4) print(s) [root@python ~]# python35 init.py ['/root', '/usr/local/python35/lib/python35.zip', '/usr/local/python35/lib/python3.5', '/usr/local/python35/lib/python3.5/plat-linux', '/usr/local/python35/lib/python3.5/lib-dynload', '/usr/local/python35/lib/python3.5/site-packages', '/media'] sun: 7 7
