Python模塊:
當代碼越來越多的時候:
我們將所有代碼放入一個py文件:無法維護,如果我們將代碼分拆放入多個py文件,同一個名字的變量不受影響 ,另外模塊名即文件名,那麼如何應用其他模塊
import math 引用math模塊
print math.pow(2,10) 調用math模塊的函數
但是模塊多了後會重名,解決衝突方式:放入不同的包即可
1.導入模塊
要使用一個模塊,我們必須首先導入該模塊。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
學習任務:
Python的os.path模塊提供了isdir()和isfile()函數,請導入該模塊,並調用函數判斷指定的目錄和文件是否存在。
注意:
1. 由於運行環境是平臺服務器,所以測試的也是服務器中的文件夾和文件,該服務器上有/data/webroot/resource/python文件夾和/data/webroot/resource/python/test.txt文件,大家可以測試下。
2. 當然,大家可以在本機上測試是否存在相應的文件夾和文件。
import os print os.path.isdir(r'C:\Windows') print os.path.isfile(r'C:\Windows\notepad.exe')
注意到os.path模塊可以以若干種方式導入:
import os import os.path from os import path from os.path import isdir, isfile
每一種方式調用 isdir 和 isfile 都有所不同。
參考代碼:
import os print os.path.isdir(r'/data/webroot/resource/python') print os.path.isfile(r'/data/webroot/resource/python/test.txt')
2.動態導入模塊
如果導入的模塊不存在,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都正常運行。
先嚐試導入json,如果失敗,再嘗試導入simplejsonas json
參考代碼:
t
ry: import json except ImportError: import simplejson as json print json.dumps({'python':2.7})
3.使用__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字符串。
使用from __future__ importunicode_literals將把Python 3.x的unicode規則帶入Python 2.7中。
參考代碼:
from __future__ import unicode_literals s = 'am I an unicode?' print isinstance(s, unicode)
安裝第三方模塊:
Python提供的模塊管理工具:
在python中安裝非自帶python模塊,有三種方式:
easy_install
2. pip(推薦,已經內置到python2.7.9)
3.下載壓縮包(.zip, .tar, .tar.gz)後解壓, 進入解壓縮的目錄後執行pythonsetup.py install命令
Life is short,i use Python。