<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python3.10發(fā)布,這個特性愛了

          共 3144字,需瀏覽 7分鐘

           ·

          2021-10-13 02:09

          大家好,今天周一,又是充滿能量的一天。最近Python社區(qū)有兩件大事

          Python登頂

          在最新一期的TIOBE榜單中,Python登頂TIOBE,排名第一,結(jié)束了Java和C多年的霸榜。?

          Python作為一門動態(tài)腳本語言可以說相當成熟,深受開發(fā)者青睞。無論是易用性、還是社區(qū)提供的第三方庫的豐富程度上,只能讓其它語言望塵莫及。盡管總有一些不同的聲音拿Python運行慢來說事,不過真正在用Python的又有多少人care呢。


          3.10正式版發(fā)布

          Python在幾天前發(fā)布了正式版3.10,雖然你不一定會馬上應用到生產(chǎn)環(huán)境,不過還是建議有條件的可以升級體驗以下,沒條件直接看我這篇文章就可以了,我列了幾個開發(fā)者可能比較感興趣的特性,看看哪個是你最期待的特性。

          1、更友好的錯誤提示

          expected?=?{9:?1,?18:?2,?19:?2,?27:?3,?28:?3,?29:?3,?36:?4,?37:?4,
          ????????????38:?4,?39:?4,?45:?5,?46:?5,?47:?5,?48:?5,?49:?5,?54:?6,
          some_other_code?=?foo()

          比如這段代碼如果你不小心漏掉一個右花括號,運行代碼時,在之前的版本中直接提示語法錯誤:

          File?"example.py",?line?3
          ????some_other_code?=?foo()
          ????????????????????^
          SyntaxError:?invalid?syntax

          不仔細檢查代碼你還真的沒法一眼看出來到底哪里語法錯誤。而在python3.10中,提示變得非常友好而且具體, 直接告訴你 "{"沒有關閉,這樣定位錯誤就很快了。

          File?"example.py",?line?1
          ????expected?=?{9:?1,?18:?2,?19:?2,?27:?3,?28:?3,?29:?3,?36:?4,?37:?4,
          ???????????????^
          SyntaxError:?'{'?was?never?closed

          類似地,還有推導式中如果忘記加圓括號時,之前一言不合直接提示語法錯誤

          >>>?{x,y?for?x,y?in?zip('abcd',?'1234')}
          ??File?"",?line?1
          ????{x,y?for?x,y?in?zip('abcd',?'1234')}
          ?????????^
          SyntaxError:?invalid?syntax

          而現(xiàn)在會告訴你,是不是忘記加圓括號了。

          >>>?{x,y?for?x,y?in?zip('abcd',?'1234')}
          ??File?"",?line?1
          ????{x,y?for?x,y?in?zip('abcd',?'1234')}
          ?????^
          SyntaxError:?did?you?forget?parentheses?around?the?comprehension?target?

          嗯,這才人性化。

          2、match ... case ?終于來了

          match ... case 語法是我比較期待的功能,它不是什么多高級的功能,類似于其它語言中的 switch ... case 語法,在多條件判斷時比用 if ... elif 代碼更簡潔。很難想象,這個語法現(xiàn)在才加進來,當然, 一開始Python之父是不愿意加這個語法特性的,好在這個語法最終還是回歸了,而且換了個名字。

          我在想,干嘛和自己過不去,統(tǒng)一都叫 switch ... case 不好嗎?也許這就是Python讓人著迷的地方吧。

          來看個例子

          這是用3.10的 match case 語法

          def?http_error(status):
          ????match?status:
          ????????case?400:
          ????????????return?"Bad?request"
          ????????case?404:
          ????????????return?"Not?found"
          ????????case?418:
          ????????????return?"I'm?a?teapot"
          ????????case?_:
          ????????????return?"Something's?wrong?with?the?internet"

          case _ ?類似于其它語言中的 default ,當其他條件都不符合就執(zhí)行這行。

          用普通的if ... else 語法來寫

          def?http_error(status):
          ????if?status?==?400:
          ????????return?"Bad?request"
          ????elif?status?==?404:
          ????????return?"Not?found"
          ????elif?status?==?418:
          ????????return?"I'm?a?teapot"
          ????else:
          ????????return?"Something's?wrong?with?the?internet"

          3、支持括號的上下文管理器

          在之前的老版本中,多個上下文管理器必須放在一行或者用轉(zhuǎn)義符“\”換行

          with?open("xxx.py",?mode="w")?as?f1,?open("yyy.py",?mode="w")?as?f2:
          ????pass

          #?或者

          with?open("xxx.py",?mode="w")?as?f1,?\
          ????????open("yyy.py",?mode="w")?as?f2:
          ????pass

          在3.10中,我們可以用括號將多個管理器放在多行,這樣代碼看起來整潔一些。

          with?(
          ????open("xxx.py",?mode="w")?as?f1,
          ????open("yyy.py",?mode="w")?as?f2
          ):
          ????pass

          4、新的類型聯(lián)合操作符

          在之前版本中,對于函數(shù)參數(shù)如果希望類型支持多種,例如同時支持int和float,需要用Union:

          from?typing?import?Union


          def?foo(number:?Union[?int,?float])?->?Union[int,?float]:
          ????return?number?**?2

          現(xiàn)在有個新的語法糖“|”,叫聯(lián)合操作符,可以讓代碼更簡潔

          def?square(number:?int?|?float)?->?int?|?float:
          ????return?number?**?2

          該操作符在函數(shù) isinstance()issubclass() 也可以支持

          #?python3.10
          >>>?isinstance(1,?int?|?str)
          True

          #?python3.7
          >>>?isinstance(1,?(int,float))
          True


          最后

          當開發(fā)者問到Python是否還會有Python4.0的時候,Python之父直言不要對 Python 4.0 抱有希望。假如真的哪天發(fā)布了Python4.0,也不會重走2.x過度到3.0的老路。同時,我們也別指望Python的GIL能夠去掉,不是沒嘗試過,而是去掉GIL之后更慢了。如果你的項目對性能非常敏感,不妨試試pypy,python的一個分支。


          對了,10月15號,在上海有個關于Go+的線下活動,在上海的同學可以去聽聽,活動是免費的。詳情這門國產(chǎn)語言終于要發(fā)布 1.0 版本了

          下期見!

          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩人妻无码一区二区三区99 | 夜夜高潮夜夜爽 | 麻豆91麻豆国产传媒的特点 | 十八禁在线网址 | 网址成人视频国产偷拍 |