欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

如何美觀地打印 Python 對象?這個標準庫可以簡單實現

系統 1660 0
原文鏈接: https://jinshuju.net/f/kb1Bcq

如何美觀地打印 Python 對象?這個標準庫可以簡單實現_第1張圖片

?

豌豆花下貓,某985高校畢業生, 兼具極客思維與人文情懷 。專注python技術、數據科學和深度學習,力圖創造一個有趣又有用的學習分享平臺。

前不久,我回顧了 Python 中 print 的發展歷史,提到了兩條發展線索:

  • 明線:早期的 print 語句帶有 C 和 Shell 的影子,是個應用程序級的 statement,在最初十幾年里,經歷過 PEP-214 和 PEP-259 的改進;再到 2009 年的大版本 3.0,由語句改成了 print() 函數,還在 3.3 版本,做過一次功能增強,最終上升成為一等的內置函數。
  • 暗線:介紹了 print 的競爭對手們,像傳統的日志模塊 logging、調試模塊 pdb、主流 IDE 的調試功能,以及后起之秀 PySnooper,它們瞄準著 print 的位置,摩拳擦掌,虎視眈眈。

本文依然跟 print 相關,想介紹的是標準庫中的 pprint 模塊。

pprint 是“pretty printer”的簡寫,“pretty”的含義是“漂亮的、美觀的”,還有表示“相當地”的程度語氣,因此它的含義便是:(相當)美觀的打印。

這是個相當簡單卻有用的模塊,主要用于打印復雜的數據結構對象,例如多層嵌套的列表、元組和字典等。

先看看 print() 打印的一個例子:

                
                  mylist?=?["Beautiful?is?better?than?ugly.",?"Explicit?is?better?than?implicit.",?"Simple?is?better?than?complex.",?"Complex?is?better?than?complicated."]

print(mylist)

#?結果如下:
['Beautiful?is?better?than?ugly.',?'Explicit?is?better?than?implicit.',?'Simple?is?better?than?complex.',?'Complex?is?better?than?complicated.']

                
              

這是一個簡單的例子,全部打印在一行里。

想象一下,如果對象中的元素是多層嵌套的內容(例如復雜的 Json 數據),或者有超多的元素(例如在列表中存了很多 URL 鏈接),再打印出來會是怎樣?

那肯定是一團糟的,不好閱讀。

使用 pprint 模塊的 pprint() 替代 print(),可以解決如下痛點:
  • 設置合適的行寬度,作適當的換行

  • 設置打印的縮進、層級,進行格式化打印
  • 判斷對象中是否有無限循環,并優化打印內容

1、簡單使用

語法: pprint(object, stream=None, indent=1, width=80, depth=None, *,compact=False)

默認的行寬度參數為 80,當打印的字符(character)小于 80 時,pprint() 基本上等同于內置函數 print(),當字符超出時,它會作美化,進行格式化輸出:

                
                  import?pprint

#?打印上例的?mylist
pprint.pprint(mylist)

#?打印的元素是換行的(因為超出80字符):
['Beautiful?is?better?than?ugly.',
?'Explicit?is?better?than?implicit.',
?'Simple?is?better?than?complex.',
?'Complex?is?better?than?complicated.']

                
              

2、設置縮進為 4 個空格(默認為1)

                
                  pprint.pprint(mylist,?indent=4)

[???'Beautiful?is?better?than?ugly.',
????'Explicit?is?better?than?implicit.',
????'Simple?is?better?than?complex.',
????'Complex?is?better?than?complicated.']

                
              

3、設置打印的行寬

                
                  mydict?=?{'students':?[{'name':'Tom',?'age':?18},{'name':'Jerry',?'age':?19}]}

pprint.pprint(mydict)

#?未超長:
{'students':?[{'age':?18,?'name':?'Tom'},?{'age':?19,?'name':?'Jerry'}]}

pprint.pprint(mydict,?width=20)

#?超長1:
{'students':?[{'age':?18,
???????????????'name':?'Tom'},
??????????????{'age':?19,
???????????????'name':?'Jerry'}]}

pprint.pprint(mydict,?width=70)

#?超長2:
{'students':?[{'age':?18,?'name':?'Tom'},
??????????????{'age':?19,?'name':?'Jerry'}]}

                
              

4、設置打印的層級(默認全打印)

                
                  newlist?=?[1,?[2,?[3,?[4,?[5]]]]]

pprint.pprint(newlist,?depth=3)

#?超出的層級會用...表示
[1,?[2,?[3,?[...]]]]

                
              

5、優化循環結構的打印

當列表或其它數據結構中出現循環引用時,要完整打印出所有內容是不可能的。

所以 print 作了簡化處理,就像上例一樣,只打印外層的殼,而不打印內層循環的東西。

這種處理方式是簡化了,但沒有指出是誰導致了循環,還容易看漏。

pprint() 方法作了改進,遇到無限循環結構時,會表示成 的格式。

還有個 saferepr() 方法,也是這樣優化,而且返回的是個字符串:

                
                  newlist?=?[1,?2]
newlist.insert(0,?newlist)

#?列表元素指向列表自身,造成循環引用
#?直接 print 的結果是:[[...], 1, 2]

pprint.pprint(newlist)
#?[
                  
                    ,?1,?2]

pprint.saferepr(newlist)
#?'[
                    
                      ,?1,?2]'

                    
                  
                
              

6、判斷是否出現循環結構

有兩個方法判斷一個對象中是否出現無限循環:

                
                  pprint.isrecursive(newlist)
#?True

pprint.isreadable(newlist)
#?False

                
              

isreadable() 除了能像 isrecursive() 一樣判斷循環,還能判斷該格式化內容是否可被 eval() 重構。

以上就是 pprint 模塊的快捷入門介紹,除此之外,還有 pformat() 方法、PrettyPrinter 類,以及某些參數的使用等內容,我覺得沒有大用,就不多說了。

如若感興趣,你可查閱:
                  
                    官方介紹:https://docs.python.org/zh-cn/3/library/pprint.html

源碼地址:https://github.com/python/cpython/blob/3.7/Lib/pprint.py
                  
                

最后,還有兩個小小的點:

1、用 pprint() 替換 print() 的技巧

在不考慮 print() 函數本身的參數的情況下,可以在引入 pprint 模塊后,寫上 “print = pprint.pprint”,令 print() 起到改頭換面的效果:

                
                  import?pprint
print?=?pprint.pprint

mylist?=?["Beautiful?is?better?than?ugly.",?"Explicit?is?better?than?implicit.",?"Simple?is?better?than?complex.",?"Complex?is?better?than?complicated."]

print(mylist)

#?可對比本文開頭的例子
['Beautiful?is?better?than?ugly.',
?'Explicit?is?better?than?implicit.',
?'Simple?is?better?than?complex.',
?'Complex?is?better?than?complicated.']

                
              

2、國人開發的 beeprint?

國內某位 pan 同學在 Github 開源了個 beeprint ,明顯是對標 pprint 的。

項目地址: https://github.com/panyanyany/beeprint

它優化了字典對象的打印,對于從其它語言轉過來的同學而言(例如 Java),這是個福音:

它還優化了長文本的打印,支持自定義對象的打印,看起來不錯。

但是,其它功能不夠齊全,而且作者停止維護兩年了,荒廢已久……

總體而言,pprint 算是 print() 的輕量級替代,簡單實用,極其方便(畢竟是標準庫),文檔豐富而有保障。

所以,若想要打印美觀易讀的數據,這個 pprint 標準庫,不妨一試哦。

如何美觀地打印 Python 對象?這個標準庫可以簡單實現_第5張圖片

▼ 點擊成為 社區注冊會員? ? ? ? ?? 「在看」 一下,一起PY!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美视频在线第一页 | 亚洲日韩视频 | 国产在线视频自拍 | 蜜桃传媒一区二区亚洲AV | 午夜家庭影院 | 亚洲第一视频网站 | 国产在线激情 | 欧美午夜一区 | 久久久久久久一区二区三区 | 欧美a级v片不卡在线观看 | 91国内精品久久久久怡红院 | 暖暖日本在线播放 | 国产亚洲视频在线 | 亚洲一区二区三区在线免费观看 | 亚洲三级国产 | 国产成人偷拍 | 91好色视频 | 国产日韩欧美在线观看不卡 | 久久视屏这里只有精品6国产 | 色欲AV久久一区二区三区 | 毛片毛片毛片毛片毛片毛片 | 91精品国产一区二区 | 午夜视频在线观看一区 | 国产精品福利短视在线播放频 | 狠狠干伊人 | 三级在线国产 | 日本午夜精品一区二区三区电影 | 国产午夜精品一区二区三区嫩草 | 欧美激情视频网 | 91视频视频 | 欧美国产免费 | 日韩城人网站 | 亚洲欧美精品伊人久久 | 精品尤物| 久久久久国产精品免费免费搜索 | 精品国精品国产自在久国产应用 | 久久久99精品免费观看 | 丝袜美腿一区 | 国产精品久久久999 午夜免费 | 五月天婷婷网亚洲综合在线 | 九九热在线视频 |