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庫