一、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...