[python] pprint 模塊 -- 優化列表的輸出格式 原

有時候我們需要在控制檯中輸出一個列表或者是字典,然而預置的 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 ,理論上第一組 abcdef 其實是可以輸出在同一行的。但是因爲 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 函數就可以幫助你。它還有 isreadableisrecursive 函數來判斷可讀性和遞歸性。如果大家水平好的話可以自己研究一下這個模塊其他函數的作用,在這裏我就貼上鍊接: pprint — Data pretty printer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章