我平常使用的程式語言主要是Fortran和Python,用於做數值計算,兩種語言各具優勢,Fortran更快,Python寫起來更方便,更適合閱讀,而且可以直接對資料進行視覺化處理。但是有時候輸出資料時顯得沒有Fortran方便,可能是因為Python不對變數型別進行區分,所以一般都是以字串的形式輸出資料。
1. str
與repr
就像引言裡說的那樣,Python
需要把所有型別的值轉化成string
進行輸出(私以為是Python
注重和人的互動,而string
是最適合與人類進行互動的資料型別),有str()
和repr()
兩種方法對資料型別進行轉化,str()
轉化後的結果更適合與人進行互動,而repr()
轉化後的結果則可以被Python
的直譯器閱讀,但當要轉化的物件沒有適合與人互動的型別時,str()
轉化的結果和repr()
是一樣的:
1 2 3 4 5 6 |
>>> s='hello world' >>> str(s) 'hello world' >>> repr(s) "'hello world'" >>> |
當互動的物件是人時,’hello world’顯而易見就是一個字串,字串代表的意思是不言而喻,或者說人更關注’ ‘內的資訊,而非’ ‘本身,但是機器則不同,如果直接把hello world傳給機器,他很難處理這個資料,但是有了’ ‘後,Python
的直譯器就知道這是一個字串,或者也可以這麼說,相較於字串的具體內容,機器更關心的是’hello world’這個整體,所以為了儲存所需要的資訊,repr()
會給轉化的物件加上” “。
1 2 3 4 5 6 7 8 9 10 11 |
>>> x=10 >>> s='the value of x is '+repr(x) >>> s 'the value of x is 10' >>> u='the value of x is '+str(x) >>> u 'the value of x is 10' >>> |
對於這種組合型別的變數,
str()
和repr()
的結果是一樣的。
1 2 3 4 5 6 7 |
>>> h='hello n' >>> print(str(h)) hello >>> print(repr(h)) 'hello n' >>> |
str()
和repr()
的區別可見一斑。
2. 表格形式的輸出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> for x in range(11): print(str(x).rjust(2), str(x * x).rjust(3), str(x**3).rjust(4)) 0 0 0 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()
等。當所給的長度小於字串本身的長度時,這些方法不會截止資料,而是原封不動返回,這可能會破壞美觀,但是總比資料破壞要好吧?如果要強制截斷資料,可以用str().ljust(n)[:n]
這種形式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> for x in range(11): print(str(x).rjust(2), str(x * x).rjust(3), str(x**3).rjust(3)[:3]) 0 0 0 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 100 |
還有一種str.zfill()
方法,與str.rjust()
不同,它補齊的是0而不是空格,而且它能夠理解正負號的意思:
1 2 3 4 5 6 7 |
>>> '123'.zfill(7) '0000123' >>> '-12.3'.zfill(7) '-0012.3' >>> '123456'.zfill(4) '123456' >>> |
3. 格式化輸出
這是一種和C語言非常相似的輸出方法,但是個人覺得更加好用:
1 2 |
>>> print('{} is a {}'.format('Cescfangs', 'gooner')) Cescfangs is a gooner |
‘{}’的內容會被format()
中的引數所替代,可以在'{}’裡填上數字來指定format()
中的位置,但是如果'{}’裡的是引數,其中的內容會以被format()
中的字元替換:
1 2 3 4 |
>>> print('{1} is a {0}'.format('Cescfangs', 'gooner')) gooner is a Cescfangs >>> print('{Ramsey} is a {gunner}'.format(Ramsey='Cescfangs', gunner='gooner')) Cescfangs is a gooner |
還可以用’:’對輸出的範圍進行控制,我們輸出小數點後三位的$pi$:
1 2 |
>>> print('value of pi is {0:.3f}'.format(math.pi)) value of pi is 3.142 |
‘:’可以起到固定位數輸出的作用,這會讓我們的輸出更加漂亮:
1 2 3 4 5 6 7 8 |
>>> arsenal = {'Ramsey': 16, 'Rosciky': 7, 'Chambers': 21, 'Ozil': 11} >>> for player, number in arsenal.items(): print('{0:10}--->{1:3d}'.format(player, number)) Rosciky ---> 7 Ozil ---> 11 Ramsey ---> 16 Chambers ---> 21 |