您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關什么是Python中的模塊,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、python中的模塊
有過C語言編程經驗的朋友都知道在C語言中如果要引用sqrt函數,必須用語句#include <math.h>引入math.h這個頭文件,否則是無法正常進行調用的。
那么在Python中,如果要引用一些其他的函數,該怎么處理呢?
在Python中有一個概念叫做模塊(module),這個和C語言中的頭文件以及Java中的包很類似,比如在Python中要調用sqrt函數,必須用import關鍵字引入math這個模塊,下面就來了解一下Python中的模塊。
說的通俗點:模塊就好比是工具包,要想使用這個工具包中的工具(就好比函數),就需要導入這個模塊。
模塊的概念:
1.每一個以擴展名py結尾的python源代碼文件都是一個模塊。
2.模塊名同樣也是一個標識符,需要符合標識符的命名規范。
3.在模塊中定義的全局變量、函數、類都是提供給外界直接使用的工具。
4.模塊就好比工具包,要想使用這個工具包中的工具,就需要先導入這個模塊。
二、import
在Python中用關鍵字import來引入某個模塊,比如要引用模塊math,就可以在文件最開始的地方用import math來引入。
import導入
import 模塊名1,模塊名2 #不推薦
說明:在導入模塊時,每個導入應該獨占一行(推薦)
import 模塊1 import 模塊2
導入之
通過模塊名使用模塊提供的工具---全局變量、函數、類。
只用as指定模塊的別名。
如果模塊的名字太長,可以使用as指定模塊的別名,以方便在代碼中的使用。
import 模塊名1 as 模塊別名
注意:模塊別名應該符合托峰值命名規范
為什么要加上模塊名呢?
因為可能存在這樣一種情況:在多個模塊中含有相同名稱的函數,此時如果只是通過函數名來調用,解釋器無法知道到底要調用哪個函數。所以如果像上述這樣引入模塊的時候,調用函數必須加上模塊名。
三、from … import
from...import導入
1.如果想從某一模塊中導入部分工具,就可以使用from...import的方式。
2.import模塊名是一次性把模塊中所有的工具全部導入,并且通過模塊名/別名訪問。
#從模塊中導入某一個工具 from 模塊名 import 工具名#可以通過as為工具指定別名
導入之后
1.不需要通過模塊名. 的方式使用模塊提供的工具
2.可以直接使用模塊提供的工具 --- 全局變量、函數、類
注意:
1.如果兩個模塊,存在同名的函數,name后導入模塊的函數會覆蓋先導入的函數
2.開發時import代碼應該統一寫在代碼的頂部,更容易及時發現沖突
3.如果發生沖突,可以使用as關鍵字,給其中一個工具起一個別名
from...import * #從模塊中導入所有工具 from 模塊名 import *
注意:
這種法師不推薦使用,因為函數重名并沒有任何的提示,出現問題不好排查
案例:
demo.py(自定義的模塊)
#全局變量 title = "模塊1" #函數 def say_hello(): print("我是%s"%title) #類 class Dog(object): pass #類 class Cat(object): pass
test.py中使用demo.py模塊
#導入模塊中的所有工具,同時為模塊指定別名為myTest import demo as myTest #導入模塊中所有工具,不推薦,工具同名不好排查 #from...import * #from...import導入模塊中的部分工具(Dog類) from demo import Dog #為導入工具Cat類指定別名Test_Cat,防止與其他模塊中工具重名 from demo import Cat as Test_Cat myTest.say_hello() dog=Dog() cat=Test_Cat()
四、python模塊導入的搜索路
程序的主目錄
PTYHONPATH目錄(如果已經進行了設置)
標準連接庫目錄(一般在/usr/local/lib/python2.X/)
任何的.pth文件的內容(如果存在的話).新功能,允許用戶把有效果的目錄添加到模塊搜索路徑中去 .pth后綴的文本文件中一行一行的地列出目錄。
這四個組建組合起來就變成了sys.path了,
當python import模塊的時候,就通過sys.path里面的目錄列表下面去查找。
sys.path是python的搜索模塊的路徑集,是一個list。
查看sys.path方法:
import sys print(sys.path)
['C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86', 'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs', 'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37', 'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Program Files\\Python37\\lib\\site-packages']
程序執行時導入模塊路徑
import sys #因為sys.path是一個列表,所以可以在后面追加一個自定的模塊路徑 sys.path.append("/home/Se7eN_HOU") #通過insert可以將路徑插到前面 sys.path.insert(0,"Home/Se7eN") print(sys.path)
運行結果為:
['Home/Se7eN', 'C:\\Users\\Se7eN_HOU\\Desktop\\Tools\\sublimetext3\\Sublime Text Build 3176 x86', 'C:\\Program Files\\Python37\\python37.zip', 'C:\\Program Files\\Python37\\DLLs', 'C:\\Program Files\\Python37\\lib', 'C:\\Program Files\\Python37', 'C:\\Users\\Se7eN_HOU\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Program Files\\Python37\\lib\\site-packages', '/home/Se7eN_HOU']
五、模塊制作
1、定義自己的模塊
在Python中,每個Python文件都可以作為一個模塊,模塊的名字就是文件的名字。
比如有這樣一個文件test.py,在test.py中定義了函數add
def add(a,b): return a+b
2、調用自己的模塊
那么在demo.py文件中就可以先import test,然后通過test.add(a,b)來調用了,當然也可以通過from test import add來引入
import test result = test.add(1,2) print(result)
運行結果為:3
3、測試模塊
在實際開中,當一個開發人員編寫完一個模塊后,為了讓模塊能夠在項目中達到想要的效果,這個開發人員會自行在py文件中添加一些測試信息,例如:test.py文件
def add(a,b): return a+b #用來測試 ret = add(11,22) print("in test.py 測試11+22 = %d"%ret)
如果此時,在demo.py文件中引入了此文件的話,想想看,測試的那段代碼是否也會執行呢!
import test result = test.add(1,2) print(result)
運行結果為:
in test.py 測試11+22 = 33 3
至此,可發現test.py中的測試代碼,應該是單獨執行test.py文件時才應該執行的,不應該是其他的文件中引用而執行。為了解決這個問題,python在執行一個文件時有個變量__name__
test.py文件中:
def add(a,b): return a+b #用來測試 #ret = add(11,22) #print("in test.py 測試11+22 = %d"%ret) print("in test.py,__name__ is %s"%__name__)
運行結果為:
in test.py,__name__ is __main__
在demo.py文件中導入test.py模塊運行為
import test result = test.add(1,2) print(result)
運行結果為:
in test.py,__name__ is test 3
可以根據__name__變量的結果能夠判斷出,是直接執行的python腳本還是被引入執行的,從而能夠有選擇性的執行測試代碼。
test.py模塊中代碼改為:
def add(a,b): return a+b if __name__ == "__main__": ret = add(11,22) print("in test.py 測試11+22 = %d"%ret)
在test.py中運行結果為:
in test.py 測試11+22 = 33
在demo.py中導入test.py模塊
import test result = test.add(1,2) print(result)
運行結果為:3
這樣我們在開中測試的代碼,就不會在其他模塊中出現了。
六、模塊中的_ _all_ _
1、沒有_ _all_ _
test.py模塊
class Test(object): def test(self): print("---Test類中的test方法---") def test1(): print("---test1方法---") def test2(): print("---test2方法---")
在demo.py中導入test.py模塊
from test import * a = Test() a.test() test1() test2()
運行結果為:
---Test類中的test方法--- ---test1方法--- ---test2方法---
2、模塊中有_ _all_ _
test.py模塊
__all__ = ["Test","test1"] class Test(object): def test(self): print("---Test類中的test方法---") def test1(): print("---test1方法---") def test2(): print("---test2方法---")
demo.py模塊
from test import * a = Test() a.test() test1() test2()
運行結果為:
---Test類中的test方法---Traceback (most recent call last): ---test1方法--- File "C:\Users\Se7eN_HOU\Desktop\Tools\sublimetext3\Sublime Text Build 3176 x86\demo.py", line 5, in <module> test2() NameError: name 'test2' is not defined
如果一個文件中有__all__變量,那么也就意味著只有這個變量中的元素,才會被from xxx import *時導入。
七、系統sys模塊介紹
sys是python自帶模塊,常用的函數有:
sys.argv: 實現從程序外部向程序傳遞參數。
sys.exit([arg]): 程序中間的退出,arg=0為正常退出。
sys.getdefaultencoding(): 獲取系統當前編碼,一般默認為ascii。
sys.setdefaultencoding(): 設置系統默認編碼,執行dir(sys)時不會看到這個方法,在解釋器中執行不通過,可以先執行reload(sys),在執行 setdefaultencoding('utf8'),此時將系統默認編碼設置為utf8。(見設置系統默認編碼 )
sys.getfilesystemencoding(): 獲取文件系統使用編碼方式,Windows下返回'mbcs',mac下返回'utf-8'。
sys.path: 獲取指定模塊搜索路徑的字符串集合,可以將寫好的模塊放在得到的某個路徑下,就可以在程序中import時正確找到。
sys.platform: 獲取當前系統平臺。
1、sys.argv[]
sys.argv[]說白了就是一個從程序外部獲取參數的橋梁,這個“外部”很關鍵。因為我們從外部取得的參數可以是多個,所以獲得的是一個列表(list),也就是說sys.argv其實可以看作是一個列表,所以才能用[]提取其中的元素。其第一個元素是程序本身,隨后才依次是外部給予的參數。
下面我們通過一個極簡單的test.py程序的運行結果來說明它的用法。
#test.py import sys a=sys.argv[0] print(a)
將test.py保存在c盤的根目錄下。
在程序中找到 ‘運行’->點擊->輸入"cmd"->回車鍵 進入控制臺命令窗口(如下圖),先輸入cd c:\ (作用是將命令路徑改到c盤根目錄),然后輸入test.py運行我們剛剛寫的程序:
得到的結果是C:\test.py,這就是0指代碼(即此.py程序)本身的意思。
然后我們將代碼中0改為1 :
a=sys.argv[1]
保存后,再從控制臺窗口運行,這次我們加上一個參數,輸入:test.py what
#test.py import sys a=sys.argv[1] print(a)
運行結果是:
得到的結果就是我們輸入的參數what,看到這里你是不是開始明白了呢。
那我們再把代碼修改一下:
a=sys.argv[2:]
保存后,再從控制臺窗臺運行程序,這次多加幾個參數,以空格隔開:
test.py a b c d e f
得到的結果為[‘b’, ’c’, ’d’, ’e’, ’f’]
應該大徹大悟了吧。Sys.argv[ ]其實就是一個列表,里邊的項為用戶輸入的參數,關鍵就是要明白這參數是從程序外部輸入的,而非代碼本身的什么地方,要想看到它的效果就應該將程序保存了,從外部來運行程序并給出參數。
2、sys.path已經在上面講過了
3、sys.exit()
程序中間的退出, arg=0為正常退出
一般情況下執行到主程序末尾,解釋器自動退出,但是如果需要中途退出程序,可以調用sys.exit函數,帶有一個可選的整數參數返回給調用它的程序,表示你可以在主程序中捕獲對sys.exit的調用。(0是正常退出,其他為異常)當然也可以用字符串參數,表示錯誤不成功的報錯信息。
import sys def exitfunc(value): print (value) sys.exit(0) print("hello") try: sys.exit(90) except SystemExit as value: exitfunc(value) print("come?")
運行結果:
hello 90
程序首先打印hello,在執行exit(90),拋異常把90傳給values,values在傳進函數中執行,打印90程序退出。后面的”come?”因為已經退出所以不會被打印. 而此時如果把exitfunc函數里面的sys.exit(0)去掉,那么程序會繼續執行到輸出”come?”。
4、sys.modules
sys.modules是一個全局字典,該字典是python啟動后就加載在內存中。每當程序員導入新的模塊,sys.modules將自動記錄該模塊。當第二次再導入該模塊時,python會直接到字典中查找,從而加快了程序運行的速度。它擁有字典所擁有的一切方法。
import sys print(sys.modules.keys()) print("**************************************************************************") print(sys.modules.values()) print("**************************************************************************") print(sys.modules["os"])
運行結果為:
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins']) ************************************************************************** dict_values([<module 'sys' (built-in)>, <module 'builtins' (built-in)>, <module '_frozen_importlib' (frozen)>, <module '_imp' (built-in)>, <module '_thread' (built-in)>, <module '_warnings' (built-in)>, <module '_weakref' (built-in)>, <module 'zipimport' (built-in)>, <module '_frozen_importlib_external' (frozen)>, <module 'io' (built-in)>, <module 'marshal' (built-in)>, <module 'nt' (built-in)>, <module 'winreg' (built-in)>, <module 'encodings' from 'C:\\Program Files\\Python37\\lib\\encodings\\__init__.py'>, <module 'codecs' from 'C:\\Program Files\\Python37\\lib\\codecs.py'>, <module '_codecs' (built-in)>, <module 'encodings.aliases' from 'C:\\Program Files\\Python37\\lib\\encodings\\aliases.py'>, <module 'encodings.utf_8' from ' C:\\Program Files\\Python37\\lib\\encodings\\utf_8.py'>, <module '_signal' (built-in)>, <module '__main__' from 'C:\\Users\\Se7eN_HOU\\Desktop\\demo.py'>, <module 'encodings.latin_1' from 'C:\\Program Files\\Python37\\lib\\encodings\\latin_1.py'>, <module 'io' from 'C:\\Program Files\\Python37\\lib\\io.py'>, <module 'abc' from 'C:\\Program Files\\Python37\\lib\\abc.py'>, <module '_abc' (built-in)>, <module 'site' from 'C:\\Program Files\\Python37\\lib\\site.py'>, <module 'os' from 'C:\\Program Files\\Python37\\lib\\os.py'>, <module 'stat' from 'C:\\Program Files\\Python37\\lib\\stat.py'>, <module '_stat' (built-in)>, <module 'ntpath' from 'C:\\Program Files\\Python37\\lib\\ntpath.py'>, <module 'genericpath' from 'C:\\Program Files\\Python37\\lib\\genericpath.py'>, <module 'ntpath' from 'C:\\Program Files\\Python37\\lib\\ntpath.py'>, <module '_collections_abc' from ' C:\\Program Files\\Python37\\lib\\_collections_abc.py'>, <module '_sitebuiltins' from 'C:\\Program Files\\Python37\\lib\\_sitebuiltins.py'>]) ************************************************************************** <module 'os' from 'C:\\Program Files\\Python37\\lib\\os.py'>
5、sys.stdin, sys.stdout, sys.stderr
stdin,stdout,stderr在Python中都是文件屬性對象, 他們在python啟動時自動與shell環境中的標準輸入, 輸出, 出錯相關. 而python程序在shell中的I/O重定向是有shell來提供的,與python本身沒有關系.python程序內部將stdin, stdout, stderr讀寫操作重定向到一個內部對象.
#import sys print("Hi, %s!' %input('Please enter your name: ")) #運行結果:Please enter your name: er #Hi, er! #等同于: import sys print('Please enter your name:') name=sys.stdin.readline()[:-1] print('Hi, %s!' %name) #標準輸出 print('Hello World!\n') #等同于: import sys sys.stdout.write('Hello world!\n')
上述就是小編為大家分享的什么是Python中的模塊了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。