有時候我們需要在控制檯中輸出一個列表或者是字典,然而預置的 print()
函數又不能整齊地進行輸出。作爲一個強迫症,我經常會在需要時自定義一個函數來進行輸出。不過直到我前幾天看到 python 的官方文檔,我發覺我又在浪費時間了。。。
其實, pprint 模塊就能很好地解決上面的問題。 pprint 是 "PrettyPrinter" 的縮寫。看到名字大家應該就知道它是幹什麼的吧。它有許多強大的可選參數。不過它的使用方式與之前介紹的模塊不同。在使用 pprint 的輸出功能之前,它要求我們先:
1. 定義一個 PrettyPrinter 對象
爲什麼要定義一個 PrettyPrinter 對象呢?其實是因爲 PrettyPrinter 的參數過多,如果你直接使用輸出語句的話,每一次輸出可能要在後面加上許多的參數。而在一個程序中,這些參數不大會改變。所以只需要一開始聲明一個對象,之後我們就可以省去重新配置參數的過程,而是直接輸出了。
那麼首先,我們要用 PrettyPrinter
函數來定義一個對象。
import pprint
pp = pprint.PrettyPrinter(width = 80)
這樣我們就定義好了一種輸出的對象了。大家可能很好奇其中的 width
參數是做什麼用的。其實 PrettyPrinter
中的參數可不止這一個。
-
width
定義最大的寬度(如果超過這個寬度會自動換行)(默認的寬度爲80) -
indent
定義縮減的空格數(默認爲1) -
compact
如果爲True
則將同一種元素壓縮到一行(默認爲False
) -
depth
定義最大的嵌套數。如果列表中超過一定的深度就以...
顯示
看完上面的介紹,是不是有一點蒙?沒事,下面我們就要介紹 pprint()
函數,用它就可以進行輸出。這樣我們就可以測試一下各個參數的功能了。
2. pprint 函數 與 PrettyPrinter 的參數效果
在上面定義好了 PrettyPrinter 對象之後,我們就可以用它來進行輸出了。我們調整幾個參數,看看它的實際效果。
import pprint
ls = ['abc', 'def', 'ghj', ['abc', 'def']]
pp = pprint.PrettyPrinter(width = 20)
pp.pprint(ls)
先不加 compact = True
,理論上第一組 abc
和 def
其實是可以輸出在同一行的。但是因爲 pprint
希望讓顯示的層次變得清晰,它並不會這樣輸出。而是變成下面的那樣:
['abc',
'def',
'ghj',
['abc', 'def']]
可以看到,前三組層次並列的數據被輸出在了不同的行,而最後兩組被輸出在了同一行。
如果我們加上 compact = True
這個參數呢?
import pprint
ls = ['abc', 'def', 'ghj', ['abc', 'def']]
pp = pprint.PrettyPrinter(width=20, compact=True)
pp.pprint(ls)
可以看到,在滿足寬度限制的情況下,前兩個數據被輸出在了同一行,而第三個數據因爲寬度超出而自動分配到了下一行。
['abc', 'def',
'ghj',
['abc', 'def']]
其實看到了上面這樣的顯示結果,一般來說不推薦大家使用 compact = True
這個參數,因爲它會讓可讀性變得有些差。(不過如果你的列表是一維的,或者數據都十分整齊,那麼 compact = True
的確可以讓列表的輸出變得更緊湊)
那麼看了上面幾個參數,還有 indent
參數沒有介紹到。我們還是以不包含 compact
爲例,用同樣的數據進行測試:
import pprint
ls = ['abc', 'def', 'ghj', ['abc', 'def']]
pp = pprint.PrettyPrinter(indent = 2, width=20)
pp.pprint(ls)
輸出在每組數據之前加上了兩個空格,其實 indent
這個參數可以讓數據看起來不那麼密集,不過加不加就看個人喜好了。
[ 'abc',
'def',
'ghj',
['abc', 'def']]
最後是 depth
參數了。其實它也是特別的實用。(只不過除了在做網絡類的程序外,其他地方不是經常用到)
比如我用一個四層嵌套的列表,然後我將最大深度 depth
設置爲 2
,來測試一下輸出效果:
import pprint
ls = ['abc', 'def', 'ghj', ['abc', ['abc', ['abc', 'def'], 'def'], 'def']]
pp= pprint.PrettyPrinter(indent = 2, depth = 2, width=20)
pp.pprint(ls)
[ 'abc',
'def',
'ghj',
[ 'abc',
[...],
'def']]
可以看到過於深層嵌套的部分就被省略掉了。這樣其實也有助於我們閱讀結果。
這大概就是 pprint
函數的功能了。
結語與其他文檔
pprint 模塊最重要的兩個函數以及他們的參數都已經介紹完了。其實它還有一些其他的函數。就比如如果你不想直接輸出列表,而是要獲得一個字符串,那麼 pformat
函數就可以幫助你。它還有 isreadable
和 isrecursive
函數來判斷可讀性和遞歸性。如果大家水平好的話可以自己研究一下這個模塊其他函數的作用,在這裏我就貼上鍊接: pprint — Data pretty printer