python中的包和庫


1模塊和包的概念

當代碼越來越多時,當把所有的代碼都集中於一個文件中時,難以維護
將代碼分開放在不同的py文件中,易於維護,同一名字的變量和函數互不影響
1 #a.py
2 x=5
3 def f1():
4     pass
1 #b.py
2 x='str'
3 def f1(iterable):
4     pass

 

a.py和b.py中變量和函數互不影響
將a.py稱為模塊a,將b.py稱為模塊b,可見,模塊的名字就是.py文件的名字
引入第三方的模塊
#test.py
import math
print math.pow(2,10)
當兩個不同的人寫的模塊名發生沖突時,將同名的模塊放入不同的包中即可避免這種沖突
如p1.util和p2.util就是兩個不同的模塊
調用時
#test.py           自身模塊名
import p1.util   引用p1.util模塊
print p1.util.f(2,10)  調用p1.util模塊的f函數
在文件系統中,包就是文件夾,模塊就是.py文件,同域名類似,包可以有多級
如何區分一個包和一個普通的目錄,在python中,包下面必須有一個__init__.py的文件,包的每一層目錄都必須有這樣文件,即使是空文件夾,只有這樣,python才會將這個目錄當作一個包來處理

2.python之導入模塊

要使用一個模塊,我們必須首先導入該模塊。Python使用import語句導入一個模塊。例如,導入系統自帶的模塊 math:

import math

你可以認為math就是一個指向已導入模塊的變量,通過該變量,我們可以訪問math模塊中所定義的所有公開的函數、變量和類:

>>> math.pow(2, 0.5) # pow是函數
1.4142135623730951

>>> math.pi # pi是變量
3.141592653589793

如果我們只希望導入用到的math模塊的某幾個函數,而不是所有函數,可以用下面的語句:

from math import pow, sin, log

這樣,可以直接引用 pow, sin, log 這3個函數,但math的其他函數沒有導入進來:

>>> pow(2, 10)
1024.0
>>> sin(3.14)
0.0015926529164868282

如果遇到名字沖突怎么辦?比如math模塊有一個log函數,logging模塊也有一個log函數,如果同時使用,如何解決名字沖突?

如果使用import導入模塊名,由於必須通過模塊名引用函數名,因此不存在沖突:

import math, logging
print math.log(10)   # 調用的是math的log函數
logging.log(10, 'something')   # 調用的是logging的log函數

如果使用 from...import 導入 log 函數,勢必引起沖突。這時,可以給函數起個“別名”來避免沖突:

from math import log
from logging import log as logger   # logging的log現在變成了logger
print log(10)   # 調用的是math的log
logger(10, 'import from logging')   # 調用的是logging的log

3. python中動態導入模塊

如果導入的模塊不存在,Python解釋器會報 ImportError 錯誤:

>>> import something
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named something

有的時候,兩個不同的模塊提供了相同的功能,比如 StringIO 和 cStringIO 都提供了StringIO這個功能。

這是因為Python是動態語言,解釋執行,因此Python代碼運行速度慢。

如果要提高Python代碼的運行速度,最簡單的方法是把某些關鍵函數用 C 語言重寫,這樣就能大大提高執行速度。

同樣的功能,StringIO 是純Python代碼編寫的,而 cStringIO 部分函數是 C 寫的,因此 cStringIO 運行速度更快。

利用ImportError錯誤,我們經常在Python中動態導入模塊:

try:
    from cStringIO import StringIO
except ImportError:
    from StringIO import StringIO

上述代碼先嘗試從cStringIO導入,如果失敗了(比如cStringIO沒有被安裝),再嘗試從StringIO導入。這樣,如果cStringIO模塊存在,則我們將獲得更快的運行速度,如果cStringIO不存在,則頂多代碼運行速度會變慢,但不會影響代碼的正常執行。

try 的作用是捕獲錯誤,並在捕獲到指定錯誤時執行 except 語句。

任務

利用import ... as ...,還可以動態導入不同名稱的模塊。

Python 2.6/2.7提供了json 模塊,但Python 2.5以及更早版本沒有json模塊,不過可以安裝一個simplejson模塊,這兩個模塊提供的函數簽名和功能都一模一樣。

試寫出導入json 模塊的代碼,能在Python 2.5/2.6/2.7都正常運行。

1 try:
2     import json
3 except ImportError:
4     import simplejson
5     print json.dumps({'python':2.7})

4.  python之使用__future__

Python的新版本會引入新的功能,但是,實際上這些功能在上一個老版本中就已經存在了。要“試用”某一新的特性,就可以通過導入__future__模塊的某些功能來實現。

例如,Python 2.7的整數除法運算結果仍是整數:

>>> 10 / 3
3

但是,Python 3.x已經改進了整數的除法運算,“/”除將得到浮點數,“//”除才仍是整數:

>>> 10 / 3
3.3333333333333335
>>> 10 // 3
3

要在Python 2.7中引入3.x的除法規則,導入__future__的division:

>>> from __future__ import division
>>> print 10 / 3
3.3333333333333335

當新版本的一個特性與舊版本不兼容時,該特性將會在舊版本中添加到__future__中,以便舊的代碼能在舊版本中測試新特性。

任務

在Python 3.x中,字符串統一為unicode,不需要加前綴 u,而以字節存儲的str則必須加前綴 b。請利用__future__的unicode_literals在Python 2.7中編寫unicode字符串。

#py2.7
from __future__ import unicode_literals
s ='am I an unicode?'
print isinstance(s, unicode)

5.安裝第三方模塊

python提供了兩種模塊管理工具
1.easy_install
2.pip(推薦,已經內置到python2.7.9以后的版本中)
在安裝過程中將python的安裝目錄設置到系統的環境變量path中
在cmd中即可打開python和使用pip的安裝第三方模塊
可以使用pip -h來獲取pip命令的使用方法

 如下圖,使用pip工具安裝web.py庫
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM