自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

新聞 前端
距 Python 3.8 穩(wěn)定版正式發(fā)布已經(jīng)過去了小半個(gè)月,不少 Python 常駐用戶已經(jīng)將 Python 更新到了 3.8 版本,也有一些朋友擔(dān)心代碼運(yùn)行兼容性等問題,依然堅(jiān)挺在 Python3.7 中。

 本文轉(zhuǎn)自雷鋒網(wǎng),如需轉(zhuǎn)載請(qǐng)至雷鋒網(wǎng)官網(wǎng)申請(qǐng)授權(quán)。

距 Python 3.8 穩(wěn)定版正式發(fā)布已經(jīng)過去了小半個(gè)月,不少 Python 常駐用戶已經(jīng)將 Python 更新到了 3.8 版本,也有一些朋友擔(dān)心代碼運(yùn)行兼容性等問題,依然堅(jiān)挺在 Python3.7 中。

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

海象(walrus )運(yùn)算符

Animesh Gaitonde 是 python 的狂熱愛好者,下面是他對(duì) python 3.8 中 walrus 運(yùn)算符的使用心得——

最近,python 社區(qū)發(fā)布了該語(yǔ)言的 3.8 版本。作為python 的超級(jí)粉絲 ,我研究了發(fā)行說明,有一個(gè)特別的操作符引起了我的注意,該運(yùn)算符稱為 walrus 運(yùn)算符(:=)或賦值表達(dá)式運(yùn)算符。

這個(gè)新運(yùn)算符(:=)使我們能夠?qū)⒅蒂x給表達(dá)式中的變量。這個(gè)符號(hào)有點(diǎn)像海象的眼睛和獠牙(因此也稱為「海象運(yùn)算符」)。

[[280022]]

  •  walrus 牛刀小試

現(xiàn)在讓我們看看下面的代碼段:

  1. countries = [「India」,「USA」,「France」,「Germany」] 
  2.  
  3. if len(countries) < 5
  4.  
  5. print ("Length of countries is " + len(countries)) 

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

  1. country_size = len(countries) 
  2.  
  3. if country_size < 5
  4.  
  5. print ("Length of countries is " + country_size) 

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

  1. if country_size := len(countries) < 5 : 
  2.  
  3. print ("Length of countries is " + country_size) 

讓我們進(jìn)一步探討這個(gè)運(yùn)算符的能力。

[[280023]]

  • 代碼行數(shù)與復(fù)雜度的平衡

讓我們看看下面的例子:

多次調(diào)用成本高昂的函數(shù)

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

使用 walrus 運(yùn)算符避免多個(gè)函數(shù)調(diào)用

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

  • 理解效率低下

基于條件填充列表

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

通過 walrus 運(yùn)算符,我們可以簡(jiǎn)化上面的代碼,并將所有內(nèi)容放在一行中。

使用者需避免對(duì) walrus 運(yùn)算符的錯(cuò)誤理解

  • 分塊處理文件

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

  1. chunk = file.read(256
  2.  
  3. while chunk: 
  4.  
  5. process(chunk) 
  6.  
  7. chunk = file.read(256

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

  1. while chunk := file.read(256) : 
  2.  
  3. process(chunk) 
  • 正則表達(dá)式匹配

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

正則表達(dá)式匹配

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

上述代碼利用 walrus 運(yùn)算符可以重寫如下,并且可以避免重新計(jì)算:

正則表達(dá)式匹配:=

  • 哪里不能用 walrus 運(yùn)算符?

1. 給變量賦值

a = 5 #Valid

a := 5 #InValid

empty_list = [] #Valid

empty_list := [] #InValid

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

2. 加減運(yùn)算

a += 5 #Valid

a :+=5 # Invalid

3. lambda 函數(shù)中的賦值表達(dá)式

(lambda: a:= 5) # Invalid

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

(var := lambda: 5) # Valid

  • PEP-572 與爭(zhēng)議

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

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

1. 句法變異

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

2. 向后兼容性

這個(gè)特性不會(huì)向后兼容,也不會(huì)在以前的 python 版本上運(yùn)行。

3. 運(yùn)算符名稱

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

關(guān)于 walrus 運(yùn)算符的爭(zhēng)論

關(guān)于 walrus 運(yùn)算符的詳細(xì)介紹就是這些,除此之外,Python3.8 也有其它新功能——

僅位置參數(shù)(Positional-Only Arguments)

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

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

  1. def f(a, b, /, c, d, *, e, f): 
  2.  
  3.  print(a, b, c, d, e, f) 

以下均為合法的調(diào)用:

  1. f(102030, d=40, e=50, f=60

但是,以下均為不合法的調(diào)用:

  1. f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument 
  2.  
  3. f(1020304050, f=60) # e must be a keyword argument 

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

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

  1. def incr(x, /): 
  2.  
  3. return x + 1 

更多關(guān)于僅位置參數(shù):https://www.python.org/dev/peps/pep-0570/ 

用于已編譯字節(jié)碼文件的并行文件系統(tǒng)緩存

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

緩存的位置會(huì)在 sys.pycache_prefix 中報(bào)告 (None 表示默認(rèn)位置即 __pycache__ 子目錄)。

更詳細(xì)內(nèi)容:https://bugs.python.org/issue33499 

調(diào)試構(gòu)建使用與發(fā)布構(gòu)建相同的 ABI

不管是在發(fā)布模式還是調(diào)試模式下構(gòu)建,Python 現(xiàn)在都使用相同的 ABI。在   Unix 上,當(dāng) Python 以調(diào)試模式構(gòu)建時(shí),現(xiàn)在可以加載以發(fā)布模式構(gòu)建的 C  擴(kuò)展和使用穩(wěn)定 ABI 構(gòu)建的 C 擴(kuò)展

更詳細(xì)內(nèi)容:https://bugs.python.org/issue36721 

f 字符串支持一個(gè)方便的 = 說明符進(jìn)行調(diào)試

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

更詳細(xì)內(nèi)容:https://bugs.python.org/issue36817 

PEP 587:Python 初始化配置

在 PEP 587 添加了新的 C API 以配置 Python 初始化,從而提供了對(duì)整個(gè)配置的更好控制和更好的錯(cuò)誤報(bào)告。

新的結(jié)構(gòu):

  • PyConfig

  • PyPreConfig

  • PyStatus

  • PyWideStringList

新的函數(shù):

  • 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()

更詳細(xì)內(nèi)容:https://www.python.org/dev/peps/pep-0587/ 

Vectorcall: 用于 CPython 的快速調(diào)用協(xié)議

添加 "vectorcall" 協(xié)議到 Python/C API。它的目標(biāo)是對(duì)已被應(yīng)用于許多類的現(xiàn)有優(yōu)化進(jìn)行正式化。任何實(shí)現(xiàn)可調(diào)用對(duì)象的擴(kuò)展類型均可使用此協(xié)議。

更詳細(xì)內(nèi)容:https://www.python.org/dev/peps/pep-0590/ 

具有外部數(shù)據(jù)緩沖區(qū)的 pickle 協(xié)議 5

當(dāng)使用 pickle 在 Python 進(jìn)程間傳輸大量數(shù)據(jù)以充分發(fā)揮多核或多機(jī)處理的優(yōu)勢(shì)時(shí),非常重要一點(diǎn)是通過減少內(nèi)存拷貝來優(yōu)化傳輸效率,并可能應(yīng)用一些定制技巧例如針對(duì)特定數(shù)據(jù)的壓縮。

pickle 協(xié)議 5 引入了對(duì)于外部緩沖區(qū)的支持,這樣 PEP 3118 兼容的數(shù)據(jù)可以與主 pickle 流分開進(jìn)行傳輸,這是由通信層來確定的。

更詳細(xì)內(nèi)容:https://www.python.org/dev/peps/pep-0574/

[[280026]]

博客地址:

http://t.cn/Ai389QHq 

更多關(guān)于 Python3.8:

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

 

責(zé)任編輯:張燕妮 來源: 雷鋒網(wǎng)
相關(guān)推薦

2020-11-17 09:17:58

框架組件基礎(chǔ)服務(wù)

2018-01-24 07:58:47

框架組件技術(shù)棧開源

2021-11-24 22:39:03

手機(jī)系統(tǒng)功能

2015-07-15 10:25:44

SDN物理交換機(jī)

2024-09-30 05:38:48

2013-11-29 14:04:42

2025-03-24 09:20:00

架構(gòu)分布式ID開發(fā)

2012-03-16 14:23:00

框架

2012-03-16 14:23:00

框架

2023-10-06 12:04:41

ORM關(guān)系型數(shù)據(jù)庫(kù)

2017-11-20 09:00:43

跳槽職場(chǎng)精英年終獎(jiǎng)

2024-05-13 09:06:01

FMTJavaSTR

2021-02-21 09:09:24

GoGOPATH代碼

2017-11-20 09:30:14

運(yùn)維PythonGO

2014-12-09 09:13:46

BaaS云備份備份即服務(wù)

2018-07-12 09:04:15

RAID陣列硬盤

2020-06-11 14:07:44

iOS 13.6.2蘋果手機(jī)

2021-10-21 09:41:43

互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)

2018-01-29 09:42:27

創(chuàng)業(yè)技術(shù)團(tuán)隊(duì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)