Python學習筆記(十二) Python模組

2021-08-07 13:43:57 字數 4520 閱讀 3915

一、python模組

python 模組(module),是乙個 python 檔案,以 .py 結尾,包含了 python 物件定義和python語句。模組讓你能夠有邏輯地組織你的 python **段,把相關的**分配到乙個模組裡能讓你的**更好用,更易懂。模組能定義函式,類和變數,模組裡也能包含可執行的**。

下例是個簡單的模組 support.py:

def print_func( par ):

print "hello : ", par

return

二、import 語句

1、模組的引入

模組定義好後,我們可以使用 import 語句來引入模組,語法如下:

import module1[, module2[,... modulen]
比如要引用模組 math,就可以在檔案最開始的地方用 import math 來引入。在呼叫 math 模組中的函式時,必須這樣引用:

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

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

# 匯入模組

import support

# 現在可以呼叫模組裡包含的函式了

support.print_func("runoob")

輸出結果為:

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

2、from…import 語句

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

from modname import name1[, name2[, ... namen]]
例如,要匯入模組 fib 的 fibonacci 函式,使用如下語句:

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

3、from…import* 語句

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

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

例如我們想一次性引入 math 模組中所有的東西,語句如下:

from math import *
三、搜尋路徑

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

1、當前目錄

2、如果不在當前目錄,python 則搜尋在 shell 變數 pythonpath 下的每個目錄。

3、如果都找不到,python會察看預設路徑。unix下,預設路徑一般為/usr/local/lib/python/。

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

四、pythonpath 變數

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

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

set pythonpath=c:\python27\lib;
在 unix 系統,典型的 pythonpath 如下:

set pythonpath=/usr/local/lib/python
五、命名空間和作用域

1、命名空間:變數是擁有匹配物件的名字(識別符號)。命名空間是乙個包含了變數名稱們(鍵)和它們各自相應的物件們(值)的字典。乙個 python 表示式可以訪問區域性命名空間和全域性命名空間裡的變數。如果乙個區域性變數和乙個全域性變數重名,則區域性變數會覆蓋全域性變數。每個函式都有自己的命名空間。

2、作用域:類的方法的作用域規則和通常函式的一樣。python 會智慧型地猜測乙個變數是區域性的還是全域性的,它假設任何在函式內賦值的變數都是區域性的。因此,如果要給函式內的全域性變數賦值,必須使用 global 語句。

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

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

money = 2000

def addmoney():

# 想改正**就取消以下注釋:

# global money

money = money + 1

print money

addmoney()

print money

六、dir()函式

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

# 匯入內建math模組

import math

content = dir(math)

print content;

輸出結果為:

['__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() 函式

八、reload() 函式

當乙個模組被匯入到乙個指令碼,模組頂層部分的**只會被執行一次。因此,如果你想重新執行模組裡頂層部分的**,可以用 reload() 函式。該函式會重新匯入之前匯入過的模組。語法如下:

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

reload(hello)
九、python中的包

包是乙個分層次的檔案目錄結構,它定義了乙個由模組及子包,和子包下的子包等組成的 python 的應用環境。簡單來說,包就是資料夾,但該資料夾下必須存在 __init__.py 檔案, 該檔案的內容可以為空。__int__.py用於標識當前資料夾是乙個包。

考慮乙個在 package_runoob 目錄下的 runoob1.py、runoob2.py、__init__.py 檔案,test.py 為測試呼叫包的**,目錄結構如下:

test.py

package_runoob

|-- __init__.py

|-- runoob1.py

|-- runoob2.py

源**如下:

def runoob1():

print "i'm in runoob1"

def runoob2():

print "i'm in runoob2"

if __name__ == '__main__':

print '作為主程式執行'

else:

print 'package_runoob 初始化'

# 匯入 phone 包

from package_runoob.runoob1 import runoob1

from package_runoob.runoob2 import runoob2

runoob1()

runoob2()

輸出結果為:

package_runoob 初始化

i'm in runoob1

i'm in runoob2

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

Python學習筆記(十二)

1.語法錯誤和異常錯誤 while true print hello python error message file c programming eclipse project pythonstudy exception.py line 9 while true print hello pyth...

python學習筆記十二(字典)

字典 1.概述 使用鍵 值 key value 儲存,具有極快的查詢速度 乙個字典裡可以儲存多個鍵 值對 注意 字典是無序的 key的特性 1 字典中的key必須唯一 2 key必須是不可變的物件 3 字串 整數等都是不可變的,可以作為key 4 list是可變的,不能作為key 例 儲存多個學生的...

Python學習筆記(十二) 標準庫

sys標準庫 sys主要負責直譯器與程式的互動,提供了一系列的函式用於和直譯器進行互動,並可以通過該模組訪問直譯器使用或者維護的變數。詳解文章 os標準庫 os模組負責程式與作業系統的互動,提供了訪問作業系統底層的介面。常用方法有 os.remove path filename 刪除檔案 os.re...