在本文中,您將學(xué)習(xí)如何用Python創(chuàng)建和導(dǎo)入自定義模塊。此外,您還將發(fā)現(xiàn)在Python中導(dǎo)入和使用定制和內(nèi)置模塊的不同技術(shù)。
模塊是指包含Python語句和定義的文件。
包含Python代碼的文件,例如:example.py,稱為模塊,其模塊名稱為example。
我們使用模塊將大型程序分解為可管理的小型文件。此外,模塊提供了代碼的可重用性。
我們可以在模塊中定義最常用的函數(shù)并將其導(dǎo)入,而不是將其定義復(fù)制到其他程序中。
讓我們創(chuàng)建一個(gè)模塊。輸入以下內(nèi)容并將其另存為example.py。
# Python模塊示例 def add(a, b): """這個(gè)程序兩個(gè)數(shù)字相加 并返回相加的結(jié)果""" result = a + b return result
這里,我們?cè)谝粋€(gè)名為example的模塊中定義了一個(gè)add()函數(shù)。該函數(shù)接受兩個(gè)數(shù)字并返回它們的和。
我們可以將模塊內(nèi)部的定義導(dǎo)入另一個(gè)模塊或Python中的交互式解釋器。
我們使用import關(guān)鍵字來做到這一點(diǎn)。要導(dǎo)入我們先前定義的模塊,example我們?cè)赑ython提示符下鍵入以下內(nèi)容。
>>> import example
這不會(huì)example直接在當(dāng)前符號(hào)表中輸入定義的功能名稱。它僅在example此處輸入模塊名稱。
使用模塊名稱,我們可以使用點(diǎn). 運(yùn)算符訪問函數(shù)。例如:
>>> example.add(4,5.5) 9.5
Python有大量可用的標(biāo)準(zhǔn)模塊。
您可以查看Python標(biāo)準(zhǔn)模塊的完整列表及其 用途。這些文件位于Python安裝位置內(nèi)的Lib目錄中。
可以像導(dǎo)入用戶定義的模塊一樣導(dǎo)入標(biāo)準(zhǔn)模塊。
有多種導(dǎo)入模塊的方法。它們列出如下。
我們可以使用import語句導(dǎo)入模塊,并如上所述使用點(diǎn)運(yùn)算符訪問其內(nèi)部的定義。這是一個(gè)實(shí)例。
# 導(dǎo)入語句示例 # 導(dǎo)入標(biāo)準(zhǔn)模塊數(shù)學(xué) import math print("π的值", math.pi)
運(yùn)行該程序時(shí),輸出為:
π的值 3.141592653589793
我們可以通過如下重命名導(dǎo)入模塊。
# 通過重命名導(dǎo)入模塊 import math as m print("π的值", m.pi)
我們已將math模塊重命名為m。在某些情況下,這可以節(jié)省我們的書寫時(shí)間。
請(qǐng)注意,該名稱math在我們的范圍內(nèi)無法識(shí)別。因此,math.pi無效的,而m.pi是正確的使用方式。
我們可以從模塊導(dǎo)入特定名稱,而無需整體導(dǎo)入模塊。這是一個(gè)實(shí)例。
# 從數(shù)學(xué)模塊僅導(dǎo)入pi from math import pi print("π的值", pi)
我們僅從模塊導(dǎo)入屬性pi。
在這種情況下,我們不使用點(diǎn)運(yùn)算符。我們可以如下導(dǎo)入多個(gè)屬性。
>>> from math import pi, e >>> pi 3.141592653589793 >>> e 2.718281828459045
我們可以使用以下構(gòu)造從模塊導(dǎo)入所有名稱(定義)。
# 從標(biāo)準(zhǔn)模塊math中導(dǎo)入所有名稱 from math import * print("pi的值", pi)
我們從數(shù)學(xué)模塊中導(dǎo)入了所有定義。這使得除帶下劃線的beginnig之外的所有名稱在我們的范圍內(nèi)可見。
導(dǎo)入帶有星號(hào)(*)符號(hào)的所有內(nèi)容都不是一種好的編程習(xí)慣。這可能導(dǎo)致標(biāo)識(shí)符重復(fù)定義。這也會(huì)影響我們代碼的可讀性。
導(dǎo)入模塊時(shí),Python會(huì)在多個(gè)位置進(jìn)行檢查。解釋器首先尋找一個(gè)內(nèi)置模塊,然后(如果找不到)進(jìn)入定義的目錄列表sys.path。搜索按此順序進(jìn)行。
當(dāng)前目錄。
PYTHONPATH (帶有目錄列表的環(huán)境變量)。
與安裝有關(guān)的默認(rèn)目錄。
>>> import sys >>> sys.path ['', 'C:\\Python33\\Lib\\idlelib', 'C:\\Windows\\system32\\python33.zip', 'C:\\Python33\\DLLs', 'C:\\Python33\\lib', 'C:\\Python33', 'C:\\Python33\\lib\\site-packages']
我們可以添加修改此列表以添加我們自己的路徑。
Python解釋器在會(huì)話期間僅導(dǎo)入一次模塊。這使事情更有效率。這是一個(gè)示例,說明其工作原理。
假設(shè)在名為的模塊中有以下代碼my_module。
# 該模塊顯示了 # 多個(gè)導(dǎo)入并重新加 print("這段代碼被執(zhí)行了")
現(xiàn)在我們看到了多次導(dǎo)入的效果。
>>> import my_module 這段代碼被執(zhí)行了 >>> import my_module >>> import my_module
我們可以看到我們的代碼只執(zhí)行了一次。這說明我們的模塊僅導(dǎo)入了一次。
現(xiàn)在,如果我們的模塊在程序執(zhí)行過程中發(fā)生了變化,我們將不得不重新加載它。一種方法是重啟解釋器。但這并沒有太大幫助。
Python提供了一種簡(jiǎn)潔的方法。我們可以使用模塊reload()內(nèi)部的函數(shù)imp來重新加載模塊。這是怎么做的。
>>> import imp >>> import my_module 這段代碼被執(zhí)行了 >>> import my_module >>> imp.reload(my_module) 這段代碼被執(zhí)行了 <module 'my_module' from '.\\my_module.py'>
我們可以使用dir()函數(shù)找出在模塊內(nèi)部定義的名稱。
例如,我們?cè)陂_始的模塊example中定義了一個(gè)add()函數(shù)。
>>> dir(example) ['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', 'add']
在這里,我們可以看到一個(gè)已排序的名稱列表(以及add)。以下劃線開頭的所有其他名稱都是與模塊關(guān)聯(lián)的默認(rèn)Python屬性(我們自己沒有定義它們)。
例如,__name__屬性包含模塊的名稱。
>>> import example >>> example.__name__ 'example'
可以使用不帶任何參數(shù)的dir()函數(shù)找出當(dāng)前名稱空間中定義的所有名稱。
>>> a = 1 >>> b = "hello" >>> import math >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'b', 'math', 'pyscripter']