Python的交互
在很多時候,你會想要讓你的程序與用戶(可能是你自己)交互。你會從用戶那里得到輸入,然后打印一些結果。我們可以分別使用raw_input和input語句來完成這些功能。對於輸出,你也可以使用多種多樣的str(字符串)類。例如,你能夠使用rjust方法來得到一個按一定寬度右對齊的字符串。利用help(str)獲得更多詳情。
另一個常用的輸入/輸出類型是處理文件。創建、讀和寫文件的能力是許多程序所必需的
文件:
你可以通過創建一個file類的對象來打開一個文件,分別使用file類的read、readline或write方法來恰當地讀寫文件。對文件的讀寫能力依賴於你在打開文件時指定的模式。最后,當你完成對文件的操作的時候,你調用close方法來告訴Python我們完成了對文件的使用。
#!/usr/bin/python
#Tue Jan 8 21:25:42 CST 2013
poem='''\
Programming is fun
When the work is done
If you wanna make your work also fun:
use Python!
'''
f=file('poem.txt','w')
f.write(poem)
f.close()
f=file('poem.txt')
while True:
line=f.readline()
if len(line) == 0:
break
print line,
f.close()
打開文件的模式可為讀(‘r’)、寫(‘w’)或追加(‘a’)。
write只能寫入字符串。
儲存器
Python提供了一個標准的模塊,稱為pickle。使用它你可以在一個文件中儲存任何Python對象,之后你又可以把它完整的取出來,這被稱為持久地儲存對象。
還有一個模塊cPickle,它的功能和pickle模塊完全相同,但是用C語言寫的所以比pickle快。
#!/usr/bin/python
#Wed Jan 9 17:40:54 CST 2013
import cPickle as p
shoplistfile='shoplist.data'
shoplist=['apple','egg','banana']
f=file(shoplistfile,'w')
p.dump(shoplist,f)
f.close
f=file(shoplistfile)
storedlist=p.load(f)
print storedlist
使用import.. as語法。以便我們可以使用跟段的模塊名稱。
Python也有異常的處理。用try..except進行異常處理。我們把通常的語句放在try塊中,而把我們的錯誤處理語句放在except塊中。
我們把所有可能引發錯誤的語句放在try塊中,然后在except從句/塊中處理所有的錯誤和異常。except從句可以專門處理單一的錯誤或異常,或者一組包括在圓括號內的錯誤/異常。如果沒有給出錯誤或異常的名稱,它會處理 所有的 錯誤和異常。對於每個try從句,至少都有一個相關聯的except從句。
try..finally
假如你在讀一個文件的時候,希望在無論異常發生與否的情況下都關閉文件,該怎么做呢?這可以使用finally塊來完成。注意,在一個try塊下,你可以同時使用except從句和finally塊。如果你要同時使用它們的話,需要把一個嵌入另外一個。
在程序中運行time.sleep(2)進行程序休息。需要加在time模塊。
Python標准庫是隨Python附帶安裝的,它包含大量機器有用的模塊。
sys模塊
sys模塊包含系統對應的功能。
sys.version字符串給你提供安裝的Python的版本信息。sys.version_info元組則提供。
一個對於有經驗的程序員,sys模塊中其他令人感興趣的項目有sys.stdin、sys.stdout和sys.stderr它們分別對應你的程序的標准輸入、標准輸出和標准錯誤流。更簡單的方法來使你的程序具備Python版本要求功能。
讀取文件:file()
f.readline()
os模塊
這個模塊包含普遍的操作系統功能。如果你希望你的程序能夠與平台無關的話,這個模塊是尤
為重要的。即它允許一個程序在編寫后不需要任何改動,也不會發生任何問題,就可以在
Linux和Windows下運行。一個例子就是使用os.sep可以取代操作系統特定的路徑分割符。
下面列出了一些在os模塊中比較有用的部分。它們中的大多數都簡單明了。
● os.name字符串指示你正在使用的平台。比如對於Windows,它是'nt',而對於Linux/Unix
用戶,它是'posix'。
● os.getcwd()函數得到當前工作目錄,即當前Python腳本工作的目錄路徑。
● os.getenv()和os.putenv()函數分別用來讀取和設置環境變量。
● os.listdir()返回指定目錄下的所有文件和目錄名。
● os.remove()函數用來刪除一個文件。
● os.system()函數用來運行shell命令。
● os.linesep字符串給出當前平台使用的行終止符。例如,Windows使用'\r\n',Linux使
用'\n'而Mac使用'\r'。
● os.path.split()函數返回一個路徑的目錄名和文件名。
>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt')
● os.path.isfile()和os.path.isdir()函數分別檢驗給出的路徑是一個文件還是目錄。類似地,os.path.exists()函數用來檢驗給出的路徑是否真地存在。
更多的Python的內容
在Python中的特殊的方法具有特殊的含義,比如__init__和__del__方法。
一般說來,特殊的方法都被用來模仿某個行為。例如,如果你想要為你的類使用x[key]這樣的索引操作(就像列表和元組一樣),那么你只需要實現__getitem__()方法就可以了。想一下,Python就是對list類這樣做的!
下面這個表中列出了一些有用的特殊方法。如果你想要知道所有的特殊方法,你可以在《Python參考手冊》中找到一個龐大的列表。
表15.1 一些特殊的方法
名稱說明
__init__(self,...) 這個方法在新建對象恰好要被返回使用之前被調用。
__del__(self) 恰好在對象要被刪除之前調用。
__str__(self) 在我們對對象使用print語句或是使用str()的時候調用。
__lt__(self,other) 當使用 小於 運算符(<)的時候調用。類似地,對於所有的運算符(+,>等等)都有特殊的方法。
__getitem__(self,key) 使用x[key]索引操作符的時候調用。
__len__(self) 對序列對象使用內建的len()函數的時候調用。
在函數中接收元組和列表
當要使函數接收元組或字典形式的參數的時候,有一種特殊的方法,它分別使用*和**前綴。這種方法在函數需要獲取可變數量的參數的時候特別有用。
>>> def powersum(power, *args):
... '''Return the sum of each argument raised to specified power.'''
... total = 0
... for i in args:
... total += pow(i, power)
... return total
...
>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100
lambda形式
lambda語句被用來創建新的函數對象,並且在運行時返回他們。
exec和eval語句
exec語句用來執行儲存在字符串或文件中的Python語句。例如,我們可以在運行時生成一個包含Python代碼的字符串,然后使用exec語句執行這些語句。下面是一個簡單的例子。
>>> exec 'print "Hello World"'
Hello World
eval語句用來計算存儲在字符串中的有效Python表達式。下面是一個簡單的例子。
>>> eval('2*3')
6
assert語句
assert語句用來聲明某個條件是真的。例如,如果你非常確信某個你使用的列表中至少有一個元素,而你想要檢驗這一點,並且在它非真的時候引發一個錯誤,那么assert語句是應用在這種情形下的理想語句。當assert語句失敗的時候,會引發一個AssertionError。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError