關於Python模塊,或許是這樣的:

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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章