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:python

import math

你能夠認爲math就是一個指向已導入模塊的變量,經過該變量,咱們能夠訪問math模塊中所定義的全部公開的函數、變量和類:web

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

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

若是咱們只但願導入用到的math模塊的某幾個函數,而不是全部函數,能夠用下面的語句:json

from math import pow, sin, log

這樣,能夠直接引用 pow, sin, log 這3個函數,但math的其餘函數沒有導入進來:python2.7

>>> 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這個功能。spa

這是由於Python是動態語言,解釋執行,所以Python代碼運行速度慢。code

若是要提升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庫
相關文章
相關標籤/搜索