Python學習(14)模組一

2022-05-18 04:18:24 字數 3799 閱讀 9438

模組讓你能夠有邏輯地組織你的python**段。

把相關的**分配到乙個 模組裡能讓你的**更好用,更易懂。

模組也是python物件,具有隨機的名字屬性用來繫結或引用。

簡單地說,模組就是乙個儲存了python**的檔案。模組能定義函式,類和變數。模組裡也能包含可執行的**。

例子

乙個叫做aname的模組裡的python**一般都能在乙個叫aname.py的檔案中找到。下例是個簡單的模組support.py。

defprint_func(par ):print"hello : ",par

return

想使用python原始檔,只需在另乙個原始檔裡執行import語句,語法如下:

importmodule1[,module2[,...modulen]

當直譯器遇到import語句,如果模組在當前的搜尋路徑就會被匯入。

搜尋路徑是乙個直譯器會先進行搜尋的所有目錄的列表。如想要匯入模組hello.py,需要把命令放在指令碼的頂端:

#!/usr/bin/python# -*- coding: utf-8 -*-# 匯入模組importsupport

# 現在可以呼叫模組裡包含的函式了support.print_func("zara")

以上例項輸出結果:

hello:zara

乙個模組只會被匯入一次,不管你執行了多少次import。這樣可以防止匯入模組被一遍又一遍地執行。

python的from語句讓你從模組中匯入乙個指定的部分到當前命名空間中。語法如下:

frommodname importname1[,name2[,...namen]]

例如,要匯入模組fib的fibonacci函式,使用如下語句:

fromfib importfibonacci

這個宣告不會把整個fib模組匯入到當前的命名空間中,它只會將fib裡的fibonacci單個引入到執行這個宣告的模組的全域性符號表。

把乙個模組的所有內容全都匯入到當前的命名空間也是可行的,只需使用如下宣告:

frommodname import*

這提供了乙個簡單的方法來匯入乙個模組中的所有專案。然而這種宣告不該被過多地使用。

當你匯入乙個模組,python解析器對模組位置的搜尋順序是:

模組搜尋路徑儲存在system模組的sys.path變數中。變數裡包含當前目錄,pythonpath和由安裝過程決定的預設目錄。

作為環境變數,pythonpath由裝在乙個列表裡的許多目錄組成。pythonpath的語法和shell變數path的一樣。

在windows系統,典型的pythonpath如下:

setpythonpath=c:\python20\lib;

在unix系統,典型的pythonpath如下:

setpythonpath=/usr/local/lib/python

變數是擁有匹配物件的名字(識別符號)。命名空間是乙個包含了變數名稱們(鍵)和它們各自相應的物件們(值)的字典。

乙個python表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。

每個函式都有自己的命名空間。類的方法的作用域規則和通常函式的一樣。

python會智慧型地猜測乙個變數是區域性的還是全域性的,它假設任何在函式內賦值的變數都是區域性的。

因此,如果要給全域性變數在乙個函式裡賦值,必須使用global語句。

global varname的表示式會告訴python, varname是乙個全域性變數,這樣python就不會在區域性命名空間裡尋找這個變數了。

例如,我們在全域性命名空間裡定義乙個變數money。我們再在函式內給變數money賦值,然後python會假定money是乙個區域性變數。然而,我們並沒有在訪問前宣告乙個區域性變數money,結果就是會出現乙個unboundlocalerror的錯誤。取消global語句的注釋就能解決這個問題。

#!/usr/bin/python# -*- coding: utf-8 -*-money=2000defaddmoney():# 想改正**就取消以下注釋:# global moneymoney=money+1printmoneyaddmoney()printmoney

dir()函式乙個排好序的字串列表,內容是乙個模組裡定義過的名字。

#!/usr/bin/python# -*- coding: utf-8 -*-# 匯入內建math模組importmath

content =dir(math)printcontent;

以上例項輸出結果:

['__doc__','__file__','__name__','acos','asin','atan','atan2','ceil','cos','cosh','degrees','e','exp','fabs','floor','fmod','frexp','hypot','ldexp','log','log10','modf','pi','pow','radians','sin','sinh','sqrt','tan','tanh']

在這裡,特殊字串變數__name__指向模組的名字,__file__指向該模組的匯入檔名。

根據呼叫地方的不同,globals()和locals()函式可被用來返回全域性和區域性命名空間裡的名字。

如果在函式內部呼叫locals(),返回的是所有能在該函式裡訪問的命名。

如果在函式內部呼叫globals(),返回的是所有在該函式裡能訪問的全域性名字。

兩個函式的返回型別都是字典。所以名字們能用keys()函式摘取。

當乙個模組被匯入到乙個指令碼,模組頂層部分的**只會被執行一次。

因此,如果你想重新執行模組裡頂層部分的**,可以用reload()函式。該函式會重新匯入之前匯入過的模組。語法如下:

reload(module_name)

在這裡,module_name要直接放模組的名字,而不是乙個字串形式。比如想過載hello模組,如下:

reload(hello)

包是乙個分層次的檔案目錄結構,它定義了乙個由模組及子包,和子包下的子包等組成的python的應用環境。

考慮乙個在phone目錄下的pots.py檔案。這個檔案有如下源**:

#!/usr/bin/python# -*- coding: utf-8 -*-defpots():print"i'm pots phone"

同樣地,我們有另外兩個儲存了不同函式的檔案:

現在,在phone目錄下建立file __init__.py:

當你匯入phone時,為了能夠使用所有函式,你需要在__init__.py裡使用顯式的匯入語句,如下:

frompotsimportpotsfromisdnimportisdnfromg3 importg3

當你把這些**新增到__init__.py之後,匯入phone包的時候這些類就全都是可用的了。

#!/usr/bin/python# -*- coding: utf-8 -*-# 匯入 phone 包importphonephone.pots()phone.isdn()phone.g3()

以上例項輸出結果:

i'm pots phone

i'm 3gphonei'm isdn phone

如上,為了舉例,我們只在每個檔案裡放置了乙個函式,但其實你可以放置許多函式。你也可以在這些檔案裡定義python的類,然後為這些類建乙個包。

python標準模組學習14

codecs模組用於建立制定格式的檔案 python編碼是通過內部編碼進行轉換的,其內部使用unicode,有兩種格式ucs 2和ucs 4,使用sys模組的maxunicode方法就能檢視內部編碼正規化 我們常用的字串的編碼解碼方法有decode與encode x.decode type 將typ...

Python學習筆記14 模組

在python中所有的模組都被加入到了sys.path中,用下面的方法可以看見模組的位置。import sys import pprint pprint.pprint sys.path usr local python2.7 lib python27.zip usr local python2.7 ...

python入門14模組

1.模組概述 為了解決難以維護的問題,我們把很多相似功能的函式分組,分別放到不同的檔案中。這樣每個檔案所包含的內容相對較少,而且對於每乙個檔案的大致功能可用檔名來體現 優點 1.提高 的可維護性 2.提高了 的復用度,當乙個模組完畢,可以被多個地方引用 3.引用其他的模組 內建模組和第三方模組和自定...