上一篇文章為:→3.8.9異常處理中拋出異常
模塊
<1>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)入這個模塊
<2>import
在Python中用關(guān)鍵字import來引入某個模塊,比如要引用模塊math,就可以在文件最開始的地方用import math來引入。
形如:
import module1,mudule2...
當(dāng)解釋器遇到import語句,如果模塊在當(dāng)前的搜索路徑就會被導(dǎo)入。
在調(diào)用math模塊中的函數(shù)時,必須這樣引用:
模塊名.函數(shù)名
- 想一想:
為什么必須加上模塊名調(diào)用呢?
- 答:
因為可能存在這樣一種情況:在多個模塊中含有相同名稱的函數(shù),此時如果只是通過函數(shù)名來調(diào)用,解釋器無法知道到底要調(diào)用哪個函數(shù)。所以如果像上述這樣引入模塊的時候,調(diào)用函數(shù)必須加上模塊名
import math
#這樣會報錯
print sqrt(2)
#這樣才能正確輸出結(jié)果
print math.sqrt(2)
有時候我們只需要用到模塊中的某個函數(shù),只需要引入該函數(shù)即可,此時可以用下面方法實現(xiàn):
from 模塊名 import 函數(shù)名1,函數(shù)名2....
不僅可以引入函數(shù),還可以引入一些全局變量、類等
- 注意:
通過這種方式引入的時候,調(diào)用函數(shù)時只能給出函數(shù)名,不能給出模塊名,但是當(dāng)兩個模塊中含有相同名稱函數(shù)的時候,后面一次引入會覆蓋前一次引入。也就是說假如模塊A中有函數(shù)function( ),在模塊B中也有函數(shù)function( ),如果引入A中的function在先、B中的function在后,那么當(dāng)調(diào)用function函數(shù)的時候,是去執(zhí)行模塊B中的function函數(shù)。
如果想一次性引入math中所有的東西,還可以通過from math import *來實現(xiàn)
<3>from…import
Python的from語句讓你從模塊中導(dǎo)入一個指定的部分到當(dāng)前命名空間中
語法如下:
from modname import name1[, name2[, ... nameN]]
例如,要導(dǎo)入模塊fib的fibonacci函數(shù),使用如下語句:
from fib import fibonacci
注意
不會把整個fib模塊導(dǎo)入到當(dāng)前的命名空間中,它只會將fib里的fibonacci單個引入
<4>from … import *
把一個模塊的所有內(nèi)容全都導(dǎo)入到當(dāng)前的命名空間也是可行的,只需使用如下聲明:
from modname import *
注意
這提供了一個簡單的方法來導(dǎo)入一個模塊中的所有項目。然而這種聲明不該被過多地使用。
<5> as
In [1]: import time as tt
In [2]: time.sleep(1)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-2-07a34f5b1e42> in <module>()
----> 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)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-82e5c2913b44> in <module>()
----> 1 sleep(1)
NameError: name 'sleep' is not defined
In [6]:
In [6]:
In [6]: sp(1)
In [7]:
<6>定位模塊
當(dāng)你導(dǎo)入一個模塊,Python解析器對模塊位置的搜索順序是:
當(dāng)前目錄
如果不在當(dāng)前目錄,Python則搜索在shell變量PYTHONPATH下的每個目錄。
如果都找不到,Python會察看默認路徑。UNIX下,默認路徑一般為/usr/local/lib/python/
模塊搜索路徑存儲在system模塊的sys.path變量中。變量里包含當(dāng)前目錄,PYTHONPATH和由安裝過程決定的默認目錄。