Python:模塊

1模塊

1.1Python中的模塊介紹和使用

有過C語言編程經(jīng)驗的朋友都知道在C語言中如果要引用sqrt函數(shù),必須用語句#include

引入math.h這個頭文件,否則是無法正常進行調(diào)用的。

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

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

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

1.1.1import

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

形如:

import module1,mudule2...

當解釋器遇到import語句,如果模塊在當前的搜索路徑就會被導入。

在調(diào)用math模塊中的函數(shù)時,必須這樣引用:

模塊名.函數(shù)名

·想一想:

為什么必須加上模塊名調(diào)用呢?

·答:

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

importmath

#這樣會報錯

printsqrt(2)

#這樣才能正確輸出結果

printmath.sqrt(2)

有時候我們只需要用到模塊中的某個函數(shù),只需要引入該函數(shù)即可,此時可以用下面方法實現(xiàn):

from模塊名import函數(shù)名1,函數(shù)名2....

不僅可以引入函數(shù),還可以引入一些全局變量、類等

注意:

o通過這種方式引入的時候,調(diào)用函數(shù)時只能給出函數(shù)名,不能給出模塊名,但是當兩個模塊中含有相同名稱函數(shù)的時候,后面一次引入會覆蓋前一次引入。也就是說假如模塊A中有函數(shù)function( ),在模塊B中也有函數(shù)function(

),如果引入A中的function在先、B中的function在后,那么當調(diào)用function函數(shù)的時候,是去執(zhí)行模塊B中的function函數(shù)。

o如果想一次性引入math中所有的東西,還可以通過from math import *來實現(xiàn)

1.1.2from…import

Python的from語句讓你從模塊中導入一個指定的部分到當前命名空間中

語法如下:

frommodnameimportname1[, name2[, ... nameN]]

例如,要導入模塊fib的fibonacci函數(shù),使用如下語句:

fromfibimportfibonacci

注意

·不會把整個fib模塊導入到當前的命名空間中,它只會將fib里的fibonacci單個引入

1.1.3from … import *

把一個模塊的所有內(nèi)容全都導入到當前的命名空間也是可行的,只需使用如下聲明:

frommodnameimport*

注意

·這提供了一個簡單的方法來導入一個模塊中的所有項目。然而這種聲明不該被過多地使用。

1.1.4as

In [1]: import time as tt

In [2]: time.sleep(1)

---------------------------------------------------------------------------

NameErrorTraceback (most recent call last)

in ()

----> 1 time.sleep(1)

NameError: name 'time' is not defined

In [3]:

In [3]:

In [3]: tt.sleep(1)

In [4]:

In [4]:

In [4]: from time import sleep as sp

In [5]: sleep(1)

---------------------------------------------------------------------------

NameErrorTraceback (most recent call last)

in ()

----> 1 sleep(1)

NameError: name 'sleep' is not defined

In [6]:

In [6]:

In [6]: sp(1)

In [7]:

1.1.5定位模塊

當你導入一個模塊,Python解析器對模塊位置的搜索順序是:

1.當前目錄

2.如果不在當前目錄,Python則搜索在shell變量PYTHONPATH下的每個目錄。

3.如果都找不到,Python會察看默認路徑。UNIX下,默認路徑一般為/usr/local/lib/python/

4.模塊搜索路徑存儲在system模塊的sys.path變量中。變量里包含當前目錄,PYTHONPATH和由安裝過程決定的默認目錄。

1.2模塊制作

1.2.1定義自己的模塊

在Python中,每個Python文件都可以作為一個模塊,模塊的名字就是文件的名字。

比如有這樣一個文件test.py,在test.py中定義了函數(shù)add

test.py

defadd(a,b):

returna+b

1.2.2調(diào)用自己定義的模塊

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

main.py

importtest

result = test.add(11,22)

print(result)

1.2.3測試模塊

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

test.py

defadd(a,b):

returna+b

#用來進行測試

ret = add(12,22)

print('int test.py file,,,,12+22=%d'%ret)

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

main.py

importtest

result = test.add(11,22)

print(result)

至此,可發(fā)現(xiàn)test.py中的測試代碼,應該是單獨執(zhí)行test.py文件時才應該執(zhí)行的,不應該是其他的文件中引用而執(zhí)行

為了解決這個問題,python在執(zhí)行一個文件時有個變量__name__

總結:

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

·__name__如果寫在被直接運行的主文件中,是”__main__”

·如果寫在被導入的文件中,運行主文件的時候,導入文件中的__name__是”模塊的名字”

1.3模塊中的__all__

1.3.1沒有__all__

1.3.2模塊中有__all__

總結

·如果一個文件中有__all__變量,那么也就意味著這個變量中的元素,不會被from xxx import *時導入

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1模塊 1.1Python中的模塊介紹和使用 有過C語言編程經(jīng)驗的朋友都知道在C語言中如果要引用sqrt函數(shù),必須...
    PythonMaO閱讀 507評論 0 0
  • 模塊簡介 在軟件開發(fā)過程中,隨著代碼的不斷增加,在一個問價里代碼就會越來越長,不容易維護。為了編寫可維護的代碼,我...
    齊天大圣李圣杰閱讀 886評論 0 0
  • 引用自理解 python 模塊加載和路徑查找 基礎概念 module模塊, 一個 py 文件或以其他文件形式存在的...
    izhangxm閱讀 3,465評論 0 8
  • 《Python 源碼剖析》筆記 import 在交互環(huán)境下,使用不帶參數(shù)的dir()可以打印當前l(fā)ocal命名空間...
    超net閱讀 3,089評論 1 6
  • 人們常常說自己的生活怎么樣怎么樣,但是這些話說出來的意義是什么,是對生活的不滿嗎? 我們都一直在說后悔,后悔上...
    微末光芒閱讀 233評論 0 0

友情鏈接更多精彩內(nèi)容