乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      如何美觀地打印Python對(duì)象?這個(gè)標(biāo)準(zhǔn)庫(kù)可以簡(jiǎn)單實(shí)現(xiàn)

       千鋒Python學(xué)堂 2019-09-02

      之前有跟大家出過(guò)一篇Python學(xué)習(xí)教程回顧 Python 中 print 的發(fā)展歷史,提到了兩條發(fā)展線索。

      明線:早期的 print 語(yǔ)句帶有 C 和 Shell 的影子,是個(gè)應(yīng)用程序級(jí)的 statement,在最初十幾年里,經(jīng)歷過(guò) PEP-214 和 PEP-259 的改進(jìn);再到 2009 年的大版本 3.0,由語(yǔ)句改成了 print() 函數(shù),還在 3.3 版本,做過(guò)一次功能增強(qiáng),最終上升成為一等的內(nèi)置函數(shù)。

      暗線:介紹了 print 的競(jìng)爭(zhēng)對(duì)手們,像傳統(tǒng)的日志模塊 logging、調(diào)試模塊 pdb、主流 IDE 的調(diào)試功能,以及后起之秀 PySnooper,它們瞄準(zhǔn)著 print 的位置,摩拳擦掌,虎視眈眈。

      這期的Python學(xué)習(xí)教程依然跟 print 相關(guān),想介紹的是標(biāo)準(zhǔn)庫(kù)中的 pprint 模塊

      pprint 是“pretty printer”的簡(jiǎn)寫,“pretty”的含義是“漂亮的、美觀的”,還有表示“相當(dāng)?shù)亍钡某潭日Z(yǔ)氣,因此它的含義便是:(相當(dāng))美觀的打印。

      這是個(gè)相當(dāng)簡(jiǎn)單卻有用的模塊,主要用于打印復(fù)雜的數(shù)據(jù)結(jié)構(gòu)對(duì)象,例如多層嵌套的列表、元組和字典等。

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

      mylist = ["Beautiful is better than ugly.", "Explicit is better than implicit.", "Simple is better than complex.", "Complex is better than complicated."]
      print(mylist)
      # 結(jié)果如下:
      ['Beautiful is better than ugly.', 'Explicit is better than implicit.', 'Simple is better than complex.', 'Complex is better than complicated.']

      這是一個(gè)簡(jiǎn)單的例子,全部打印在一行里。

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

      那肯定是一團(tuán)糟的,不好閱讀!

      使用 pprint 模塊的 pprint() 替代 print(),可以解決如下痛點(diǎn):

      • 設(shè)置合適的行寬度,作適當(dāng)?shù)膿Q行

      • 設(shè)置打印的縮進(jìn)、層級(jí),進(jìn)行格式化打印

      • 判斷對(duì)象中是否有無(wú)限循環(huán),并優(yōu)化打印內(nèi)容

      如何美觀地打印Python對(duì)象?這個(gè)標(biāo)準(zhǔn)庫(kù)可以簡(jiǎn)單實(shí)現(xiàn)

      1、簡(jiǎn)單使用

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

      默認(rèn)的行寬度參數(shù)為 80,當(dāng)打印的字符(character)小于 80 時(shí),pprint() 基本上等同于內(nèi)置函數(shù) print(),當(dāng)字符超出時(shí),它會(huì)作美化,進(jìn)行格式化輸出:

      import pprint
      # 打印上例的 mylist
      pprint.pprint(mylist)
      # 打印的元素是換行的(因?yàn)槌?0字符):
      ['Beautiful is better than ugly.',
      'Explicit is better than implicit.',
      'Simple is better than complex.',
      'Complex is better than complicated.']

      2、設(shè)置縮進(jìn)為 4 個(gè)空格(默認(rèn)為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、設(shè)置打印的行寬

      mydict = {'students': [{'name':'Tom', 'age': 18},{'name':'Jerry', 'age': 19}]}
      pprint.pprint(mydict)
      # 未超長(zhǎng):
      {'students': [{'age': 18, 'name': 'Tom'}, {'age': 19, 'name': 'Jerry'}]}
      pprint.pprint(mydict, width=20)
      # 超長(zhǎng)1:
      {'students': [{'age': 18,
      'name': 'Tom'},
      {'age': 19,
      'name': 'Jerry'}]}
      pprint.pprint(mydict, width=70)
      # 超長(zhǎng)2:
      {'students': [{'age': 18, 'name': 'Tom'},
      {'age': 19, 'name': 'Jerry'}]}

      4、設(shè)置打印的層級(jí)(默認(rèn)全打?。?/span>

      newlist = [1, [2, [3, [4, [5]]]]]
      pprint.pprint(newlist, depth=3)
      # 超出的層級(jí)會(huì)用...表示
      [1, [2, [3, [...]]]]

      5、優(yōu)化循環(huán)結(jié)構(gòu)的打印

      當(dāng)列表或其它數(shù)據(jù)結(jié)構(gòu)中出現(xiàn)循環(huán)引用時(shí),要完整打印出所有內(nèi)容是不可能的。

      所以 print 作了簡(jiǎn)化處理,就像上例一樣,只打印外層的殼,而不打印內(nèi)層循環(huán)的東西。

      這種處理方式是簡(jiǎn)化了,但沒(méi)有指出是誰(shuí)導(dǎo)致了循環(huán),還容易看漏。

      pprint() 方法作了改進(jìn),遇到無(wú)限循環(huán)結(jié)構(gòu)時(shí),會(huì)表示成<Recursion on typename with id=number> 的格式。

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

      newlist = [1, 2]
      newlist.insert(0, newlist)
      # 列表元素指向列表自身,造成循環(huán)引用
      # 直接 print 的結(jié)果是:[[...], 1, 2]
      pprint.pprint(newlist)
      # [<Recursion on list with id=1741283656456>, 1, 2]
      pprint.saferepr(newlist)
      # '[<Recursion on list with id=1741283656456>, 1, 2]'

      6、判斷是否出現(xiàn)循環(huán)結(jié)構(gòu)

      有兩個(gè)方法判斷一個(gè)對(duì)象中是否出現(xiàn)無(wú)限循環(huán):

      pprint.isrecursive(newlist)
      # True
      pprint.isreadable(newlist)
      # False

      isreadable() 除了能像 isrecursive() 一樣判斷循環(huán),還能判斷該格式化內(nèi)容是否可被 eval() 重構(gòu)。

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

      最后,還有個(gè)小小的點(diǎn):

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

      在不考慮 print() 函數(shù)本身的參數(shù)的情況下,可以在引入 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)
      # 可對(duì)比本文開頭的例子
      ['Beautiful is better than ugly.',
      'Explicit is better than implicit.',
      'Simple is better than complex.',
      'Complex is better than complicated.']

      總體而言,pprint 算是 print() 的輕量級(jí)替代,簡(jiǎn)單實(shí)用,極其方便(畢竟是標(biāo)準(zhǔn)庫(kù)),文檔豐富而有保障。

      所以,若想要打印美觀易讀的數(shù)據(jù),這個(gè) pprint 標(biāo)準(zhǔn)庫(kù),不妨一試哦。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多