溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Python中的模塊

發(fā)布時間:2020-08-25 14:02:14 來源:億速云 閱讀:157 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)什么是Python中的模塊,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、python中的模塊

有過C語言編程經(jīng)驗的朋友都知道在C語言中如果要引用sqrt函數(shù),必須用語句#include <math.h>引入math.h這個頭文件,否則是無法正常進行調(diào)用的。

那么在Python中,如果要引用一些其他的函數(shù),該怎么處理呢?

在Python中有一個概念叫做模塊(module),這個和C語言中的頭文件以及Java中的包很類似,比如在Python中要調(diào)用sqrt函數(shù),必須用import關(guān)鍵字引入math這個模塊,下面就來了解一下Python中的模塊。

說的通俗點:模塊就好比是工具包,要想使用這個工具包中的工具(就好比函數(shù)),就需要導(dǎo)入這個模塊。

模塊的概念:

1.每一個以擴展名py結(jié)尾的python源代碼文件都是一個模塊。

2.模塊名同樣也是一個標(biāo)識符,需要符合標(biāo)識符的命名規(guī)范。

3.在模塊中定義的全局變量、函數(shù)、類都是提供給外界直接使用的工具。

4.模塊就好比工具包,要想使用這個工具包中的工具,就需要先導(dǎo)入這個模塊。

二、import

在Python中用關(guān)鍵字import來引入某個模塊,比如要引用模塊math,就可以在文件最開始的地方用import math來引入。

import導(dǎo)入

import 模塊名1,模塊名2 #不推薦

說明:在導(dǎo)入模塊時,每個導(dǎo)入應(yīng)該獨占一行(推薦)

import 模塊1
import 模塊2

導(dǎo)入之

通過模塊名使用模塊提供的工具---全局變量、函數(shù)、類。

只用as指定模塊的別名。

如果模塊的名字太長,可以使用as指定模塊的別名,以方便在代碼中的使用。

import 模塊名1 as 模塊別名

注意:模塊別名應(yīng)該符合托峰值命名規(guī)范

為什么要加上模塊名呢?

因為可能存在這樣一種情況:在多個模塊中含有相同名稱的函數(shù),此時如果只是通過函數(shù)名來調(diào)用,解釋器無法知道到底要調(diào)用哪個函數(shù)。所以如果像上述這樣引入模塊的時候,調(diào)用函數(shù)必須加上模塊名。

三、from … import

from...import導(dǎo)入

1.如果想從某一模塊中導(dǎo)入部分工具,就可以使用from...import的方式。

2.import模塊名是一次性把模塊中所有的工具全部導(dǎo)入,并且通過模塊名/別名訪問。

#從模塊中導(dǎo)入某一個工具
from 模塊名 import 工具名#可以通過as為工具指定別名

導(dǎo)入之后

1.不需要通過模塊名. 的方式使用模塊提供的工具

2.可以直接使用模塊提供的工具  --- 全局變量、函數(shù)、類

注意:

1.如果兩個模塊,存在同名的函數(shù),name后導(dǎo)入模塊的函數(shù)會覆蓋先導(dǎo)入的函數(shù)

2.開發(fā)時import代碼應(yīng)該統(tǒng)一寫在代碼的頂部,更容易及時發(fā)現(xiàn)沖突

3.如果發(fā)生沖突,可以使用as關(guān)鍵字,給其中一個工具起一個別名

from...import *
#從模塊中導(dǎo)入所有工具
from 模塊名 import *

注意:

這種法師不推薦使用,因為函數(shù)重名并沒有任何的提示,出現(xiàn)問題不好排查

案例:

demo.py(自定義的模塊)

#全局變量
title = "模塊1"
#函數(shù)
def say_hello():
    print("我是%s"%title)
#類
class Dog(object):
    pass
#類
class Cat(object):
    pass

test.py中使用demo.py模塊

#導(dǎo)入模塊中的所有工具,同時為模塊指定別名為myTest
import demo as myTest
#導(dǎo)入模塊中所有工具,不推薦,工具同名不好排查
#from...import * 
#from...import導(dǎo)入模塊中的部分工具(Dog類)
from demo import Dog
#為導(dǎo)入工具Cat類指定別名Test_Cat,防止與其他模塊中工具重名
from demo import Cat as Test_Cat
myTest.say_hello()
dog=Dog()
cat=Test_Cat()

四、python模塊導(dǎo)入的搜索路

程序的主目錄

PTYHONPATH目錄(如果已經(jīng)進行了設(shè)置)

標(biāo)準(zhǔn)連接庫目錄(一般在/usr/local/lib/python2.X/)

任何的.pth文件的內(nèi)容(如果存在的話).新功能,允許用戶把有效果的目錄添加到模塊搜索路徑中去 .pth后綴的文本文件中一行一行的地列出目錄。

這四個組建組合起來就變成了sys.path了,

當(dāng)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']

程序執(zhí)行時導(dǎo)入模塊路徑

import sys
#因為sys.path是一個列表,所以可以在后面追加一個自定的模塊路徑
sys.path.append("/home/Se7eN_HOU")
#通過insert可以將路徑插到前面
sys.path.insert(0,"Home/Se7eN")
print(sys.path)

運行結(jié)果為:

['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中定義了函數(shù)add

def  add(a,b):
    return a+b

2、調(diào)用自己的模塊

那么在demo.py文件中就可以先import test,然后通過test.add(a,b)來調(diào)用了,當(dāng)然也可以通過from test import add來引入

import test
result = test.add(1,2)
print(result)

運行結(jié)果為:3

3、測試模塊

在實際開中,當(dāng)一個開發(fā)人員編寫完一個模塊后,為了讓模塊能夠在項目中達到想要的效果,這個開發(fā)人員會自行在py文件中添加一些測試信息,例如:test.py文件

def add(a,b):
    return a+b
    #用來測試
ret = add(11,22)
print("in test.py 測試11+22 = %d"%ret)

如果此時,在demo.py文件中引入了此文件的話,想想看,測試的那段代碼是否也會執(zhí)行呢!

import test
result = test.add(1,2)
print(result)

運行結(jié)果為:

in test.py 測試11+22 = 33
3

至此,可發(fā)現(xiàn)test.py中的測試代碼,應(yīng)該是單獨執(zhí)行test.py文件時才應(yīng)該執(zhí)行的,不應(yīng)該是其他的文件中引用而執(zhí)行。為了解決這個問題,python在執(zhí)行一個文件時有個變量__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__)

運行結(jié)果為:

in test.py,__name__ is __main__

在demo.py文件中導(dǎo)入test.py模塊運行為

import test
result = test.add(1,2)
print(result)

運行結(jié)果為:

in test.py,__name__ is test
3

可以根據(jù)__name__變量的結(jié)果能夠判斷出,是直接執(zhí)行的python腳本還是被引入執(zhí)行的,從而能夠有選擇性的執(zhí)行測試代碼。

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中運行結(jié)果為:

in test.py 測試11+22 = 33

在demo.py中導(dǎo)入test.py模塊

import test
result = test.add(1,2)
print(result)

運行結(jié)果為:3

這樣我們在開中測試的代碼,就不會在其他模塊中出現(xiàn)了。

六、模塊中的_ _all_ _

1、沒有_ _all_ _

test.py模塊

class Test(object):
    def test(self):
        print("---Test類中的test方法---")
def test1():
    print("---test1方法---")
def test2():
    print("---test2方法---")

在demo.py中導(dǎo)入test.py模塊

from test import *
a = Test()
a.test()
test1()
test2()

運行結(jié)果為:

---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()

運行結(jié)果為:

---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 *時導(dǎo)入。

七、系統(tǒng)sys模塊介紹

sys是python自帶模塊,常用的函數(shù)有:

sys.argv: 實現(xiàn)從程序外部向程序傳遞參數(shù)。

sys.exit([arg]): 程序中間的退出,arg=0為正常退出。

sys.getdefaultencoding(): 獲取系統(tǒng)當(dāng)前編碼,一般默認(rèn)為ascii。

sys.setdefaultencoding(): 設(shè)置系統(tǒng)默認(rèn)編碼,執(zhí)行dir(sys)時不會看到這個方法,在解釋器中執(zhí)行不通過,可以先執(zhí)行reload(sys),在執(zhí)行 setdefaultencoding('utf8'),此時將系統(tǒng)默認(rèn)編碼設(shè)置為utf8。(見設(shè)置系統(tǒng)默認(rèn)編碼 )

sys.getfilesystemencoding(): 獲取文件系統(tǒng)使用編碼方式,Windows下返回'mbcs',mac下返回'utf-8'。

sys.path: 獲取指定模塊搜索路徑的字符串集合,可以將寫好的模塊放在得到的某個路徑下,就可以在程序中import時正確找到。

sys.platform: 獲取當(dāng)前系統(tǒng)平臺。

1、sys.argv[]

sys.argv[]說白了就是一個從程序外部獲取參數(shù)的橋梁,這個“外部”很關(guān)鍵。因為我們從外部取得的參數(shù)可以是多個,所以獲得的是一個列表(list),也就是說sys.argv其實可以看作是一個列表,所以才能用[]提取其中的元素。其第一個元素是程序本身,隨后才依次是外部給予的參數(shù)。

下面我們通過一個極簡單的test.py程序的運行結(jié)果來說明它的用法。

#test.py 
import sys
a=sys.argv[0]
print(a)

將test.py保存在c盤的根目錄下。

在程序中找到 ‘運行’->點擊->輸入"cmd"->回車鍵   進入控制臺命令窗口(如下圖),先輸入cd c:\   (作用是將命令路徑改到c盤根目錄),然后輸入test.py運行我們剛剛寫的程序:

什么是Python中的模塊

得到的結(jié)果是C:\test.py,這就是0指代碼(即此.py程序)本身的意思。

然后我們將代碼中0改為1 :

a=sys.argv[1]

保存后,再從控制臺窗口運行,這次我們加上一個參數(shù),輸入:test.py what

#test.py
import sys

a=sys.argv[1]
print(a)

運行結(jié)果是:

什么是Python中的模塊

得到的結(jié)果就是我們輸入的參數(shù)what,看到這里你是不是開始明白了呢。

那我們再把代碼修改一下:

a=sys.argv[2:]

保存后,再從控制臺窗臺運行程序,這次多加幾個參數(shù),以空格隔開:

test.py a b c d e f

什么是Python中的模塊

得到的結(jié)果為[‘b’, ’c’, ’d’, ’e’, ’f’]

應(yīng)該大徹大悟了吧。Sys.argv[ ]其實就是一個列表,里邊的項為用戶輸入的參數(shù),關(guān)鍵就是要明白這參數(shù)是從程序外部輸入的,而非代碼本身的什么地方,要想看到它的效果就應(yīng)該將程序保存了,從外部來運行程序并給出參數(shù)。

2、sys.path已經(jīng)在上面講過了

3、sys.exit()

程序中間的退出, arg=0為正常退出 

一般情況下執(zhí)行到主程序末尾,解釋器自動退出,但是如果需要中途退出程序,可以調(diào)用sys.exit函數(shù),帶有一個可選的整數(shù)參數(shù)返回給調(diào)用它的程序,表示你可以在主程序中捕獲對sys.exit的調(diào)用。(0是正常退出,其他為異常)當(dāng)然也可以用字符串參數(shù),表示錯誤不成功的報錯信息。

import sys
def exitfunc(value):
    print (value)
    sys.exit(0)
print("hello")
try:
    sys.exit(90)
except SystemExit as value:
    exitfunc(value)   
print("come?")

運行結(jié)果:

hello
90

程序首先打印hello,在執(zhí)行exit(90),拋異常把90傳給values,values在傳進函數(shù)中執(zhí)行,打印90程序退出。后面的”come?”因為已經(jīng)退出所以不會被打印. 而此時如果把exitfunc函數(shù)里面的sys.exit(0)去掉,那么程序會繼續(xù)執(zhí)行到輸出”come?”。

4、sys.modules 

sys.modules是一個全局字典,該字典是python啟動后就加載在內(nèi)存中。每當(dāng)程序員導(dǎo)入新的模塊,sys.modules將自動記錄該模塊。當(dāng)?shù)诙卧賹?dǎo)入該模塊時,python會直接到字典中查找,從而加快了程序運行的速度。它擁有字典所擁有的一切方法。

import sys
print(sys.modules.keys())
print("**************************************************************************")
print(sys.modules.values())
print("**************************************************************************")
print(sys.modules["os"])

運行結(jié)果為:

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環(huán)境中的標(biāo)準(zhǔn)輸入, 輸出, 出錯相關(guān). 而python程序在shell中的I/O重定向是有shell來提供的,與python本身沒有關(guān)系.python程序內(nèi)部將stdin, stdout, stderr讀寫操作重定向到一個內(nèi)部對象.

#import sys
print("Hi, %s!' %input('Please enter your name: "))
#運行結(jié)果:Please enter your name: er
#Hi, er!
#等同于:
import sys
print('Please enter your name:')
name=sys.stdin.readline()[:-1]
print('Hi, %s!' %name)
#標(biāo)準(zhǔn)輸出
print('Hello World!\n')
#等同于:
import sys
sys.stdout.write('Hello world!\n')

上述就是小編為大家分享的什么是Python中的模塊了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI