模組就是 python 程式。換句話說,任何 python 程式都可以作為模組,包括在前面章節中寫的所有 python 程式,都可以作為模組。
**的可重用性體現在,當編寫好乙個模組後,只要程式設計過程中需要用到該模組中的某個功能(由變數、函式、類實現),無需做重複性的編寫工作,直接在程式中匯入該模組即可使用該功能。
def
hello()
:print
("hello world"
)
再在桌面建立另乙個say.py檔案包含**
import hello
hello.hello(
)#hello world
hello.py 就是乙個自定義的模組,我們只需要將 hellp.py 模組匯入到 say.py 檔案中,就可以直接在 say.py 檔案中使用模組中的資源。
當呼叫模組中的 hello() 函式時,使用的語法格式為「模組名.函式」,這是因為,相對於 say.py 檔案,hello.py 檔案中的**自成乙個命名空間,因此在呼叫其他模組中的函式時,需要明確指明函式的出處,否則 python 直譯器將會報錯。
命名空間表示識別符號的可見範圍,乙個識別符號可以在多個命名空間之中定義,在不同命名空間的含義互不相干
命名空間因為物件不同可以分為以下幾種
import的用法:
匯入指定模組中的所有成員(包括變數、函式、類等)。但是匯入模組中的成員時候需要使用模組名(別名)作為字首
只會匯入模組中指定的成員,而不是全部成員。同時,當程式中使用該成員時,無需附加任何字首,直接使用成員名(或別名)即可。
import sys
print
(sys.ar**[0]
)#c:/users/lenovo/pycharmprojects/untitled/123.py
sys 模組下的 ar** 變數用於獲取執行 python 程式的命令列引數,其中 ar**[0] 用於獲取當前 python 程式的儲存路徑
為模組指定別名
import sys as s
print
(s.ar**[0]
)#c:/users/lenovo/pycharmprojects/untitled/123.py
一次匯入多個模組,使用「,」逗號分隔開
# 匯入sys、os兩個模組
import sys,os
# 使用模組名作為字首來訪問模組中的成員
print
(sys.ar**[0]
)# os模組的sep變數代表平台上的路徑分隔符
print
(os.sep)
執行結果
c:/users/lenovo/pycharmprojects/untitled/123.py\
from sys import ar** as s
print
(s[0])
#c:/users/lenovo/pycharmprojects/untitled/123.py
一般不建議一次匯入模組裡的所以成員
模組的另乙個重要特性就是**的重用
#py1.py
defc2f
(cel)
: fah=cel*
1.8+
32return fah
deff2c
(fah)
: cel=
(fah-32)
/1.8
return cel
deftest()
:print
("測試,0攝氏度=%.2f華氏度"
% c2f(0)
)print
("測試,0華氏度=%.2f攝氏度"
% f2c(0)
)test(
)#測試,0攝氏度=32.00華氏度
#測試,0華氏度=-17.78攝氏度
在另外乙個檔案(py2.py)中匯入在呼叫
#py2.py
import py1
print
("32攝氏度=%.2f華氏度"
%py1.c2f(32)
)#測試,0攝氏度=32.00華氏度
#測試,0華氏度=-17.78攝氏度
#32攝氏度=89.60華氏度
py2將py1中的測試和函式也一塊執行了避免這樣情況,需要使用板塊中的__name__屬性:
在作為程式執行時__name__屬性的值是』__main__』,而作為模組匯入時候這個的值就是該模組的名字英雌就容易理解 if _\name__=』__main__'的意思
def
c2f(cel)
: fah=cel*
1.8+
32return fah
deff2c
(fah)
: cel=
(fah-32)
/1.8
return cel
deftest()
:print
("測試,0攝氏度=%.2f華氏度"
% c2f(0)
)print
("測試,0華氏度=%.2f攝氏度"
% f2c(0)
)if _——name__=
'__main__':
test(
)#測試,0攝氏度=32.00華氏度
#測試,0華氏度=-17.78攝氏度
確保只有單獨執行py1.py才能執行test函式
當直譯器遇到 import 語句,如果模組在當前的搜尋路徑就會被匯入。
我們使用 import 語句的時候,python 直譯器是怎樣找到對應的檔案的呢?這就涉及到 python 的搜尋路徑,搜尋路徑是由一系列目錄名組成的,python 直譯器就依次從這些目錄中去尋找所引入的模組。
搜尋路徑是在 python 編譯或安裝的時候確定的,安裝新的庫應該也會修改。搜尋路徑被儲存在 sys 模組中的 path 變數中。
import sys
print
(sys.path)
#['c:\\users\\lenovo\\pycharmprojects\\untitled', 'c:\\users\\lenovo\\pycharmprojects\\untitled', 'e:\\python37\\python37.zip', 'e:\\python37\\dlls', 'e:\\python37\\lib', 'e:\\python37', 'e:\\python37\\lib\\site-packages']
面對模組名重複問題,python提供了包(package)的概念,包用來管理python模組命名空間的形式,採用「點模組名稱」
建立包的步驟:
fk_package┠──init.py
┠── module1.py
┗━━ module2.py
注意,包的本質就是模組,因此匯入包和匯入模組的語法類似
import 包名[.模組名 [as 別名]]from 包名 import 模組名 [as 別名]
from 包名.模組名 import 成員名 [as 別名]
與模組類似,包被匯入之後,會在包目錄下生成乙個pycache資料夾,並在該資料夾內為包生成乙個init.cpython-36.pyc 檔案。通過此語法格式匯入包中的指定模組後,在使用該模組中的成員(變數、函式、類)時,需新增「包名.模組名」為字首。
當匯入指定包時,程式會自動執行該包所對應資料夾下的init.py 檔案中的**。需要注意的是,當使用此語法格式僅匯入包名時:
import first_packagefirst_package.module1.display(20)
#attributeerror: module 'first_package' has no attribute 'module1'
直接匯入包名,並不會將包中所有模組全部匯入到程式中,它的作用僅僅是匯入並執行包下的init.py 檔案, Python學習筆記 Day16
今日大綱 一 物件導向的組合 組合 給乙個類的物件封裝乙個屬性,這個屬性就是另乙個類的物件 組合的意義 讓乙個類的物件和另乙個類的物件產生關係,讓乙個類和另乙個類產生關係 如何組合 1 在類1中定義乙個方法,類1的物件1在執行這個方法的時候能增加乙個屬性,屬性值就是類2的物件2 2 物件1執行這個方...
re模組和物件導向day16
compile 正規表示式 編譯正規表示式,建立正規表示式物件1 fullmatch 正規表示式,字串 讓整個字串和正常則表示式進行匹配 2 match 正規表示式,字串 匹配字串開頭 如果匹配不到結果是none,如果匹配成功了,結果是匹配物件re str r d result match re s...
實習日記 Day16
今日份新想法 今天不在公司寫實習日記啦,在回學校的路上寫 今日地鐵 思 今天中午飯後,帶著我去了公司 附近的公園遛彎兒。一路走得飛快,興致勃勃。跟他的健步比起來,我一點都沒有年輕人該有的朝氣與活力 這才上班半個月,我現在週末的狀態就完全不比往日,變得昏昏欲睡,萎靡不振。在辦公室久坐,的確是不行啊。今...