回味Python2.7——筆記2
一、模塊
模塊是包括 Python 定義和聲明的文件。文件名就是模塊名加上 .py
後綴。模塊的模塊名(做為一個字符串)可以由全局變量 __name__
得到。
1、
模塊可以導入其他的模塊。 一個(好的)習慣是將所有的 import
語句放在模塊的開始(或者是腳本),這並非強制。 被導入的模塊名會放入當前模塊的全局符號表中。
from fibo import * :這樣可以導入所有除了以下劃線( _
)開頭的命名。
需要註意的是在實踐中往往不鼓勵從一個模塊或包中使用 *
導入所有,因為這樣會讓代碼變得很難讀。不過,在交互式會話中這樣用很方便省力。
2、模塊的搜索路徑
導入一個叫 spam
的模塊時,解釋器先在當前目錄中搜索名為 spam.py
的文件。如果沒有找到的話,接著會到 sys.path
變量中給出的目錄列表中查找。
變量 sys.path
是解釋器模塊搜索路徑的字符串列表。它由環境變量 PYTHONPATH
初始化,如果沒有設定 PYTHONPATH
,就由內置的默認值初始化。
>>> import sys >>> sys.path.append(‘/../..‘)
3、dir()
函數
內置函數 dir()
用於按模塊名搜索模塊定義,它返回一個字符串類型的存儲列表
>>> import fibo, sys >>> dir(fibo) [‘__name__‘, ‘fib‘, ‘fib2‘]
無參數調用時, dir()
函數返回當前定義的命名:
>>> dir() [‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘a‘, ‘fib‘, ‘fibo‘, ‘sys‘]
註意該列表列出了所有類型的名稱:變量,模塊,函數,等等。
列出內置函數和變量名
>>> import builtins >>> dir(builtins) [‘ArithmeticError‘, ‘AssertionError‘, ‘AttributeError‘, ‘BaseException‘, ‘BufferError‘, ‘BytesWarning‘......]
二、 輸入和輸出
1、格式化輸出
通常,你想要對輸出做更多的格式控制,而不是簡單的打印使用空格分隔的值。 有兩種方法可以格式化你的輸出: 第一種方法是由你自己處理整個字符串,通過使用字符串切割和連接操作可以創建任何你想要的輸出形式。string 類型包含一些將字符串填充到指定列寬度的有用操作,隨後就會討論這些。 第二種方法是使用 str.format()
方法。
標準模塊 string
包括了一些操作,將字符串填充入給定列時,這些操作很有用。隨後我們會討論這部分內容。第二種方法是使用 Template
方法。
當然,還有一個問題,如何將值轉化為字符串?很幸運,Python 有辦法將任意值轉為字符串:將它傳入 repr()
或 str()
函數。
函數 str()
用於將值轉化為適於人閱讀的形式,而 repr()
轉化為供解釋器讀取的形式(如果沒有等價的語法,則會發生 SyntaxError
異常) 某對象沒有適於人閱讀的解釋形式的話, str()
會返回與 repr()
等同的值。很多類型,諸如數值或鏈表、字典這樣的結構,針對各函數都有著統一的解讀方式。字符串和浮點數,有著獨特的解讀方式。
有兩種方式可以寫平方和立方表:
>>> for x in range(1, 11): ... print repr(x).rjust(2), repr(x*x).rjust(3) ... # Note use of ‘end‘ on previous line ... print repr(x*x*x).rjust(4) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 >>> for x in range(1, 11): ... print ‘{0:2d} {1:3d} {2:4d}‘.format(x, x*x, x*x*x) ... 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000
for x in range(1, 11): print ‘{0:5d} {1:5d} {2:5d}‘.format(x, x*x, x*x*x)
1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000
以上是一個 str.rjust()
方法的演示,它把字符串輸出到一列,並通過向左側填充空格來使其右對齊。類似的方法還有 str.ljust()
和 str.center()
。這些函數只是輸出新的字符串,並不改變什麽。如果輸出的字符串太長,它們也不會截斷它,而是原樣輸出,這會使你的輸出格式變得混亂,不過總強過另一種選擇(截斷字符串),因為那樣會產生錯誤的輸出值。(如果你確實需要截斷它,可以使用切割操作,例如: x.ljust(n)[:n]
。)
還有另一個方法, str.zfill()
它用於向數值的字符串表達左側填充 0。該函數可以正確理解正負號:
>>> ‘12‘.zfill(5) ‘00012‘ >>> ‘-3.14‘.zfill(7) ‘-003.14‘ >>> ‘3.14159265359‘.zfill(5) ‘3.14159265359‘
方法 str.format()
的基本用法如下:
>>> print ‘We are the {} who say "{}!"‘.format(‘knights‘, ‘Ni‘) We are the knights who say "Ni!"
大括號和其中的字符會被替換成傳入 str.format()
的參數。大括號中的數值指明使用傳入 str.format()
方法的對象中的哪一個:
>>> print ‘{0} and {1}‘.format(‘spam‘, ‘eggs‘) spam and eggs >>> print ‘{1} and {0}‘.format(‘spam‘, ‘eggs‘) eggs and spam
如果在 str.format()
調用時使用關鍵字參數,可以通過參數名來引用值:
>>> print ‘This {food} is {adjective}.‘.format( ... food=‘spam‘, adjective=‘absolutely horrible‘) This spam is absolutely horrible.
定位和關鍵字參數可以組合使用
>>> print ‘The story of {0}, {1}, and {other}.‘.format(‘Bill‘, ‘Manfred‘, other=‘Georg‘) The story of Bill, Manfred, and Georg.
‘!s‘
(應用 str()
) 和 ‘!r‘
(應用 repr()
) 可以在格式化之前轉換值
字段名後允許可選的 ‘:‘
和格式指令。這允許對值的格式化加以更深入的控制。下例將 Pi 轉為三位精度。
>>> import math >>> print(‘The value of PI is approximately {0:.3f}.‘.format(math.pi)) The value of PI is approximately 3.142.
在字段後的 ‘:‘
後面加一個整數會限定該字段的最小寬度,這在美化表格時很有用。
>>> table = {‘Sjoerd‘: 4127, ‘Jack‘: 4098, ‘Dcab‘: 7678} >>> for name, phone in table.items(): ... print ‘{0:10} ==> {1:10d}‘.format(name, phone) ... Jack ==> 4098 Dcab ==> 7678 Sjoerd ==> 4127
操作符 %
也可以用於字符串格式化.
>>> import math >>> print ‘The value of PI is approximately %5.3f.‘ % math.pi The value of PI is approximately 3.142.
2、文件讀寫
函數 open()
返回文件對象,通常的用法需要兩個參數: open(filename, mode)
>>> f = open(‘workfile‘, ‘w‘) >>> print f <open file ‘workfile‘, mode ‘w‘ at 80a0960>
第一個參數是一個標識文件名的字符串。第二個參數是由有限的字母組成的字符串,描述了文件將會被如何使用。可選的 模式 有: ‘r‘
,此選項使文件只讀; ‘w‘
,此選項使文件只寫(對於同名文件,該操作使原有文件被覆蓋); ‘a‘
,此選項以追加方式打開文件; ‘r+‘
,此選項以讀寫方式打開文件; 模式 參數是可選的。如果沒有指定,默認為 ‘r‘
模式
要讀取文件內容,需要調用 f.read(size)
,該方法讀取若幹數量的數據並以字符串形式返回其內容, size 是可選的數值,指定字符串長度。如果沒有指定 size 或者指定為負數,就會讀取並返回整個文件。
>>> f.read() ‘This is the entire file.\n‘ >>> f.read() ‘‘
f.readline()
從文件中讀取單獨一行,字符串結尾會自動加上一個換行符( \n
),只有當文件最後一行沒有以換行符結尾時,這一操作才會被忽略。
>>> f.readline() ‘This is the first line of the file.\n‘ >>> f.readline() ‘Second line of the file\n‘ >>> f.readline() ‘‘
f.readlines()
返回一個列表,其中包含了文件中所有的數據行。
>>> f.readlines() [‘This is the first line of the file.\n‘, ‘Second line of the file\n‘]
當你使用完一個文件時,調用 f.close()
方法就可以關閉它並釋放其占用的所有系統資源。
用關鍵字 with
處理文件對象是個好習慣。它的先進之處在於文件用完後會自動關閉,就算發生異常也沒關系。它是 try
-finally
塊的簡寫
pickle
模塊
Python 提供了一個名為 pickle
的標準模塊。這是一個令人贊嘆的模塊,幾乎可以把任何 Python 對象 (甚至是一些 Python 代碼段!)表達為為字符串,這一過程稱之為封裝 ( pickling )。從字符串表達出重新構造對象稱之為拆封( unpickling )。封裝狀態中的對象可以存儲在文件或對象中,也可以通過網絡在遠程的機器之間傳輸。
如果你有一個對象 x
,一個以寫模式打開的文件對象 f
,封裝對象的最簡單的方法只需要一行代碼:
pickle.dump(x, f)
如果 f
是一個以讀模式打開的文件對象,就可以重裝拆封這個對象:
x = pickle.load(f)
回味Python2.7——筆記2