打印數字時,我們希望對數字如何顯示有一些控制:
顯示多少位小數;
使用常規記法還是 E 記法;
是否增加前導或末尾的 0;
是否在數字前面顯示正負號(+ 或 -)。
利用格式字符串,Python 為我們提供了充分的靈活性,不僅可以完成這些工作,甚至還可以做更多事情!
例如,如果你在使用一個天氣預報程序,你想看到下面哪一個結果呢?是這樣:
Today\'s High: 72.45672132, Low 45.4985756
還是這樣:
Today\'s High: 72, Low: 45
適當地顯示數字對很多程序來說都很重要。
下面先來看一個例子。假設我們想要打印一個有兩位小數的浮點數。試著在交互模式中執行以下命令:
>>> dec_number = 12.3456>>> print \'It is %.2f degrees today.\' % dec_numberIt is 12.35 degrees today
print
語句中間包含一個格式字符串。不過這一次沒有直接使用 %f
,而是使用了 %.2f
。這就告訴 Python 要採用浮點數格式,而且小數點後面要顯示兩位。(注意,Python 非常聰明,它會正確地把數字四捨五入為兩位小數,而不是直接去掉多餘的數位。)
這個字符串後面,第二個 %
字符告訴 Python 接下來就是要打印的數。這個數要採用格式字符串中描述的格式來打印。再看幾個例子就能明白了。
你的記性不錯,卡特! %
符號確實用作取余操作符(整數除法中求餘數),這是我們在第 3 章中學過的,不過它也用於指示格式字符串。Python 能夠區分出你是指取余還是格式字符串。
整數:%d
或%i
要把某項內容打印成整數,可以使用 %d
或 %i
格式字符串。(我不知道為什麼會有兩個,不過用哪個都可以。)
>>> number = 12.67>>> print \'%i\' % number12
注意,這一次數字沒有四捨五入。它被截斷(truncated,表示「直接切斷」)了。如果是四捨五入,我們會看到 13 而不是 12。使用整數格式化時,數字會被截斷,不過使用浮點數格式化時,數字則會四捨五入。
這裡要注意以下 3 個方面。
字符串中不要求有其他文本,可以只包含格式字符串。
即使是浮點數,也可以把它打印為整數。這可以通過格式字符串實現。
Python 會把值截斷為上一個最大整數1。不過,這與
int
函數(在第 4 章見過)不同,因為格式字符串不會像int
那樣創建一個新的值,而只是改變值顯示的方式。
1原文這裡是「下一個最小整數」,這是不對的。例如,13.2 會截斷為 13,也就是上一個最大整數,而下一個最小整數應當是 14,13.2 當然不會截斷為 14。——譯者注
剛剛我們用整數格式打印 12.67,結果 Python 打印出了 12。不過變量 number
的值並沒有改變。可以檢查一下:
>>> print number12.67
number
的值並沒有改變。我們只是使用格式字符串採用不同的方式打印。
浮點數:%f
或 %F
打印小數時,可以在格式字符串中使用大寫或小寫的 f(%f
或 %F
):
>>> number = 12.3456>>> print \'%f\' % number12.345600
如果只使用 %f
,數字會顯示為有 6 位小數。如果在 f
前面加上 .n
,這裡 n
可以是任意整數,就會把數字四捨五入為指定的小數位數:
>>> print \'%.2F\' % number12.35
可以看到它把數字 12.3456 四捨五入到小數點後前兩位:12.35。
如果指定的小數位比數中實際的小數位還要多,Python 會用 0 來填充(pad):
>>> print \'%.8f\' % number12.34560000
這個數的小數點後面只有 4 位,但我們要求有 8 位小數,所以另外 4 位會用 0 來填充。
如果是負數,%f
總會顯示 -號。如果希望數字總會顯示正負號(即使它是一個正數),可以在 %
後面加一個 + 號(如果列表中既有正數也有負數,這對於列表的對齊也很有好處):
>>> print \'%+f\' % number+12.345600
如果希望包含正負數的列表對齊,但是不希望看到正數帶 + 號,可以在 %
後面使用一個空格代替 +:
>>> number2 = -98.76>>> print \'% .2f\' % number2-98.76>>> print \'% .2f\' % number 12.35
輸出中的 12 前面有一個空格,所以,儘管 98 前面有負號而 12 前面沒有正負號,這兩個數也能對齊。
E 記法:%e
和 %E
我們在第 3 章討論過 E 記法,前面說過我會告訴你如何使用 E 記法來打印數字。好吧,現在就來介紹這個內容。
>>> number = 12.3456>>> print \'%e\' % number1.234560e+01
要使用 %e
格式字符串打印 E 記法。它總是打印 6 位小數,除非你另作要求。
如果要打印更多或更少的小數位,可以在 %
後面使用 .n
,就像打印浮點數時一樣:
>>> number = 12.3456>>> print \'%.3e\' % number1.235e+01>>> print \'%.8e\' % number1.23456000e+01
%.3e
四捨五入為 3 位小數,%.8e
增加了一些 0 來填充不足的小數位。
小寫或大寫 e 都是可以的,你在格式字符串中使用什麼大小寫形式,輸出時也會顯示同樣的大小寫:
>>> print \'%E\' % number1.234560E+01
自動浮點數或 E 記法:%g
和 %G
如果你希望 Python 自動選擇浮點數記法或 E 記法,可以使用 %g
格式字符串。同樣,如果使用大寫,輸出中就會得到一個大寫的 E:
>>> number1 = 12.3>>> number2 = 456712345.6>>> print \'%g\' % number112.3>>> print \'%g\' % number24.56712e+08
注意到了嗎? Python 會為大數自動選擇 E 記法,而對較小的數使用浮點數記法。
如何打印百分號
你可能很想知道,既然百分號(%
)對格式字符串來說是一個特殊的字符,那麼怎麼打印 %
呢?
嗯,Python 有時候很聰明,它能確定你什麼時候使用 %
符號開始一個格式字符串,以及什麼時候只是想打印一個百分號。可以試試這個命令:
>>> print \'I got 90% on my math test!\'I got 90% on my math test!
在這個例子中,字符串外面沒有第二個 %
,也沒有需要格式化的變量,所以 Python 認為這個 %
只是字符串中的一個普通字符。
但是如果你在打印格式化字符串時想打印一個百分號,就需要輸入兩個百分號,就像你曾經用兩個反斜線來打印一個反斜線一樣。我們說第一個百分號對第二個百分號進行了轉義,就像在本章前面的術語箱中提到的一樣:
>>> math = 75.4>>> print \'I got %.1f%% on my math test\' % mathI got 75.4% on my math test
第一個 %
表示格式化字符串。兩個 %%
在一起告訴 Python,你希望打印出一個 %
字符。引號外面的 %
告訴 Python 你需要將後面的變量打印出來。
多個格式化字符串
如果你想在一個 print
語句中放入多個格式化字符串,該怎麼辦呢?你可以這樣做:
>>> math = 75.4>>> science = 82.1>>> print \'I got %.1f in math and %.1f in science\' % (math, science)
你可以在 print
語句中放入任意多個格式化字符串,後面跟一個變量元組(tuple)。還記得嗎?元組和列表很像,只是它使用的是圓括號而不是方括號,而且元組是不可變的。這是 Python 顯得很挑剔的一個地方,這裡你必須使用元組,而不能使用列表。除非只有一個變量需要格式化,這時才可以不用元組。(你在很多例子中已經見過了。)請確保(引號內的)格式化字符串的數量和(引號外的)變量數量相同,否則程序會報錯。
存儲格式化數字
有時你不想直接打印出格式化的數字,而是希望把它存儲在一個字符串中以備以後使用。這很容易,可以不打印,把它直接賦給一個變量,如下:
>>> my_string = \'%.2f\' % 12.3456>>> print my_string12.35>>> print \'The answer is\', my_stringThe answer is 12.35
這裡沒有直接打印格式化數字,我們把它賦給變量 my_string
。再將 my_string
與其他一些文本結合,並打印整個句子。
對於 GUI 和其他圖形程序(如遊戲)來說,將格式化數字存儲為字符串非常有用。一旦有一個對應格式化字符串的變量名,就可以採用你希望的任何方式來顯示:可以顯示在文本框中,顯示在對話框中,或者顯示在遊戲屏幕上。