<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發者 正文
      發私信給楊鯉萍
      發送

      0

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      本文作者: 楊鯉萍 2019-10-23 19:29
      導語:Python???

      雷鋒網 AI 開發者按:距 Python 3.8 穩定版正式發布已經過去了小半個月,不少 Python 常駐用戶已經將 Python 更新到了 3.8 版本,也有一些朋友擔心代碼運行兼容性等問題,依然堅挺在 Python3.7 中。

      那么,究竟要不要更新到 Python 3.8?新版本有哪些特點?它能為程序猿們帶來怎樣的收益?一位外國的 python 忠實小哥哥發了一篇文章,用眾多實例詳細講解了 Python 3.8 特別的新功能。雷鋒網 AI 開發者也將其更多功能整理編譯到后文中,希望這篇文章能幫助你更好的理解 Python 3.8。

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      海象(walrus )運算符

      Animesh Gaitonde 是 python 的狂熱愛好者,下面是他對 python 3.8 中 walrus 運算符的使用心得——

      最近,python 社區發布了該語言的 3.8 版本。作為python 的超級粉絲 ,我研究了發行說明,有一個特別的操作符引起了我的注意,該運算符稱為 walrus 運算符(:=)或賦值表達式運算符。

      這個新運算符(:=)使我們能夠將值賦給表達式中的變量。這個符號有點像海象的眼睛和獠牙(因此也稱為「海象運算符」)。

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      •  walrus 牛刀小試

      現在讓我們看看下面的代碼段:

      countries = [「India」,「USA」,「France」,「Germany」]

      if len(countries) < 5:

      print ("Length of countries is " + len(countries))

      在這個代碼段中,我們將調用函數 len()兩次。有什么方法可以避免重新調用以提高可讀性嗎?是的,在改進代碼之后,我們得到了以下結果:

      country_size = len(countries)

      if country_size < 5:

      print ("Length of countries is " + country_size)

      還有進一步改進的余地嗎?我們是否可以避免在單獨的行中為變量「country_size」賦值?在 Python3.8 中引入的 walrus 運算符可以拯救我們,它使我們可以在 if 語句本身中聲明和賦值:

      if country_size := len(countries) < 5 :

      print ("Length of countries is " + country_size)

      讓我們進一步探討這個運算符的能力。

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      • 代碼行數與復雜度的平衡

      讓我們看看下面的例子:

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      多次調用成本高昂的函數

      在上面的示例中,通過多次調用運行成本高的函數來填充列表。但在 walrus 運算符的幫助下,我們可以將結果存儲在一個變量中,并在進一步的計算中重用同一個變量,從而避免多次調用 get_count()函數。下面是使用 walrus 運算符后的示例:

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      使用 walrus 運算符避免多個函數調用

      從上面的例子可以看出,walrus 運算符減少了代碼行,使代碼更具可讀性,從而簡化了審閱者的工作。此外,它在代碼行數和代碼復雜度之間達到了更好地平衡。

      • 理解效率低下

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      基于條件填充列表

      在上面的例子中,我們正在執行多個操作。最初,我們創建了一個空列表,然后迭代一個 id 列表,并通過檢查結果是否有效來填充該列表。

      通過 walrus 運算符,我們可以簡化上面的代碼,并將所有內容放在一行中。

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      使用者需避免對 walrus 運算符的錯誤理解

      • 分塊處理文件

      在處理一個大文件時,我們將文件分成塊并讀取。每次讀取塊時,都會檢查該值,并將其作為 while 循環中的終止條件,代碼如下:

      chunk = file.read(256)

      while chunk:

      process(chunk)

      chunk = file.read(256)

      通過使用 walrus 運算符,我們可以在 while 循環的表達式中讀取并分配所讀數值,這樣還能夠避免在 while 循環外顯式聲明變量。下面是一個例子:

      while chunk := file.read(256) :

      process(chunk)

      • 正則表達式匹配

      正則表達式匹配是一個需要兩個步驟的過程。在第一步中,我們檢查是否發生匹配,在下一步中,我們提取子組:

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      正則表達式匹配

      從上面的代碼可以看出,如果匹配,我們正在重新計算 re.match(info),這會根據數據降低程序的速度。

      上述代碼利用 walrus 運算符可以重寫如下,并且可以避免重新計算:

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      正則表達式匹配:=

      • 哪里不能用 walrus 運算符?

      1. 給變量賦值

      a = 5 #Valid

      a := 5 #InValid

      empty_list = [] #Valid

      empty_list := [] #InValid

      如上所示,我們不能將=運算符與:=運算符一起使用,walrus 運算符只能是表達式的一部分。

      2. 加減運算

      a += 5 #Valid

      a :+=5 # Invalid

      3. lambda 函數中的賦值表達式

      (lambda: a:= 5) # Invalid

      lambda: (a := 5) # Valid, but not useful

      (var := lambda: 5) # Valid

      • PEP-572 與爭議

      walrus 運算符是作為 pep-572(python 增強建議)的一部分引入的。

      一個面向大眾的工具,必須得到發明者圭多·范·羅森(Guido van Rossum)和他所選的代表們的批準。因此,圍繞 walrus 運算符的爭論很多,其中部分內容如下:

      1. 句法變異

      開發人員提出了許多替代「:=」,例如表達式->名稱、名稱->表達式、{表達式} 名稱等。很少有使用現有關鍵字的建議,而其他使用新的運算符的建議。

      2. 向后兼容性

      這個特性不會向后兼容,也不會在以前的 python 版本上運行。

      3. 運算符名稱

      人們推薦的名字,比如'assignment operator'、'named expression operator'、'becomes operator'等等,而不是像 walrus operator 這樣的行話,會導致混淆。

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      關于 walrus 運算符的爭論

      關于 walrus 運算符的詳細介紹就是這些,除此之外,Python3.8 也有其它新功能——

      僅位置參數(Positional-Only Arguments)

      這是新增的一個函數形參語法,用來指明某些函數形參必須使用僅限位置而非關鍵字參數的形式。這種標記語法與通過 help() 所顯示的使用 Larry Hastings 的 Argument Clinic 工具標記的 C 函數相同。

      在下面的例子中,形參 a 和 b 為僅限位置形參,c 或 d 可以是位置形參或關鍵字形參,而 e 或 f 要求為關鍵字形參:

      def f(a, b, /, c, d, *, e, f):

       print(a, b, c, d, e, f)

      以下均為合法的調用:

      f(10, 20, 30, d=40, e=50, f=60)

      但是,以下均為不合法的調用:

      f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument

      f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument

      這種標記形式的一個用例是它允許純 Python 函數完整模擬現有的用 C 代碼編寫的函數的行為。另一個用例是在不需要形參名稱時排除關鍵字參數。例如,內置的 len() 函數的簽名為 len(obj, /)。

      除了這一點,在 Python3.8 中,可以用 / 來表示必須通過僅位置參數之前的參數。這極大地方便了之前在自定義函數中,開發者沒有簡單的方法指定參數為僅位置參數的問題。

      def incr(x, /):

      return x + 1

      更多關于僅位置參數:https://www.python.org/dev/peps/pep-0570/ 

      用于已編譯字節碼文件的并行文件系統緩存

      新增的 PYTHONPYCACHEPREFIX 設置 (也可使用 -X pycache_prefix) 可將隱式的字節碼緩存配置為使用單獨的并行文件系統樹,而不是默認的每個源代碼目錄下的 __pycache__ 子目錄。

      緩存的位置會在 sys.pycache_prefix 中報告 (None 表示默認位置即 __pycache__ 子目錄)。

      更詳細內容:https://bugs.python.org/issue33499 

      調試構建使用與發布構建相同的 ABI

      不管是在發布模式還是調試模式下構建,Python 現在都使用相同的 ABI。在   Unix 上,當 Python 以調試模式構建時,現在可以加載以發布模式構建的 C  擴展和使用穩定 ABI 構建的 C 擴展

      更詳細內容:https://bugs.python.org/issue36721 

      f 字符串支持一個方便的 = 說明符進行調試

      =在 f-string 中添加了一個說明符。f 字符串(例如)f'{expr=}' 將擴展為表達式的文本、等號,然后擴展為求值表達式的表示形式。

      更詳細內容:https://bugs.python.org/issue36817 

      PEP 587:Python 初始化配置

      在 PEP 587 添加了新的 C API 以配置 Python 初始化,從而提供了對整個配置的更好控制和更好的錯誤報告。

      新的結構:

      • PyConfig

      • PyPreConfig

      • PyStatus

      • PyWideStringList

      新的函數:

      • PyConfig_Clear()

      • PyConfig_InitIsolatedConfig()

      • PyConfig_InitPythonConfig()

      • PyConfig_Read()

      • PyConfig_SetArgv()

      • PyConfig_SetBytesArgv()

      • PyConfig_SetBytesString()

      • PyConfig_SetString()

      • PyPreConfig_InitIsolatedConfig()

      • PyPreConfig_InitPythonConfig()

      • PyStatus_Error()

      • PyStatus_Exception()

      • PyStatus_Exit()

      • PyStatus_IsError()

      • PyStatus_IsExit()

      • PyStatus_NoMemory()

      • PyStatus_Ok()

      • PyWideStringList_Append()

      • PyWideStringList_Insert()

      • Py_BytesMain()

      • Py_ExitStatusException()

      • Py_InitializeFromConfig()

      • Py_PreInitialize()

      • Py_PreInitializeFromArgs()

      • Py_PreInitializeFromBytesArgs()

      • Py_RunMain()

      更詳細內容:https://www.python.org/dev/peps/pep-0587/ 

      Vectorcall: 用于 CPython 的快速調用協議

      添加 "vectorcall" 協議到 Python/C API。它的目標是對已被應用于許多類的現有優化進行正式化。任何實現可調用對象的擴展類型均可使用此協議。

      更詳細內容:https://www.python.org/dev/peps/pep-0590/ 

      具有外部數據緩沖區的 pickle 協議 5

      當使用 pickle 在 Python 進程間傳輸大量數據以充分發揮多核或多機處理的優勢時,非常重要一點是通過減少內存拷貝來優化傳輸效率,并可能應用一些定制技巧例如針對特定數據的壓縮。

      pickle 協議 5 引入了對于外部緩沖區的支持,這樣 PEP 3118 兼容的數據可以與主 pickle 流分開進行傳輸,這是由通信層來確定的。

      更詳細內容:https://www.python.org/dev/peps/pep-0574/

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      博客地址:

      http://t.cn/Ai389QHq 

      更多關于 Python3.8:

      https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html 

      雷鋒網 AI 開發者

      雷峰網原創文章,未經授權禁止轉載。詳情見轉載須知

      Python 3.8 究竟要不要升級?用過之后的小哥這樣說

      分享:
      當月熱門文章
      最新文章
      請填寫申請人資料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 少妇被粗大的猛烈进出动视频 | 国产精品扒开腿做爽爽爽a片唱戏 日产精品久久久久久久蜜臀 | 亚洲国产一区二区a毛片日本| 国产蜜臀av在线一区尤物 | 日韩精品av一区二区三区| 国产成人精品日本亚洲第一区| 性欧美丰满熟妇xxxx性| 91九色TS另类国产人妖| 激情欧美精品一区二区| 国产麻豆精品久久一二三| 元氏县| 伊人桃花网| 欧美成人一区二免费视频| 丹寨县| 久久人人爽人人爽人人片av| 亚洲最大成人| 人妻在线无码一区二区三区| 黑人av无码一区| 暖暖免费观看电视在线高清| 99久热re在线精品99 6热视频| 宁波市| 亚洲电影在线观看| 精品国产午夜福利在线观看| 成人无号精品一区二区三区| 亚洲欧美中文日韩v在线观看 | 国产麻豆freesexvideos中国 | 一本大道无码人妻| 国产精品国产成人国产三级| 日韩操逼网| 精品人妻一| 欧美a在线| 日韩欧美精品有码在线观看| 亚洲成av人片在www鸭子| 扶沟县| 国产精品成人国产乱| 国产97在线?|?日韩| 久久熟| 亚洲资源在线| 亚洲av永久无码精品三区在线| 无码人妻视频一区二区三区| 色窝AV|