python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里
Python3.8正式發(fā)布!新特性解析在這里
詩(shī)書塞外 Python程序員
10月14日,Python 3.8 正式版發(fā)布。這也意味著一個(gè)Python開(kāi)發(fā)周期的結(jié)束,和另一個(gè)開(kāi)發(fā)周期的開(kāi)始。Python 3.9 預(yù)計(jì)在2020年10月份發(fā)布。
那么Python 3.8都帶來(lái)了什么新特性和什么新改動(dòng)呢?讓我們來(lái)盤點(diǎn)一下。
新特性
1、賦值表達(dá)式
顧名思義,就是在表達(dá)式中進(jìn)行賦值。這個(gè)特性總體來(lái)說(shuō)是一個(gè)語(yǔ)法糖,讓代碼看起來(lái)更簡(jiǎn)潔了一點(diǎn)點(diǎn)。比如,下面這段代碼:
n = len(a)
if (n) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
在Python 3.8中可以寫為:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
如果n這個(gè)變量只有在if語(yǔ)句及子句中使用,那么明顯Python 3.8的寫法更為簡(jiǎn)潔。其中Python 3.8中用到的操作符:=被稱為海象操作符(因?yàn)檫@個(gè)操作符看起來(lái)像海象的眼睛和一對(duì)兒長(zhǎng)牙)。
嗯,你看,像不像?
這個(gè)特性的另外兩個(gè)典型例子是在while語(yǔ)句,以及列表推導(dǎo)中,像這樣:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
2、限定位置參數(shù)
這個(gè)特性允許你通過(guò)在函數(shù)參數(shù)列表中加一個(gè)"/",來(lái)表示"/"之前的參數(shù)只能夠當(dāng)作位置參數(shù)使用。下面我們看一個(gè)例子:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
這個(gè)例子中,a、b只能當(dāng)作位置參數(shù)使用,e、f只能當(dāng)作關(guān)鍵字參數(shù)使用(如果你不知道為什么,請(qǐng)復(fù)習(xí)*和**的用法),而c、d即可以用作位置參數(shù),也可以用作關(guān)鍵字參數(shù)。
這個(gè)特性主要是庫(kù)或者基礎(chǔ)代碼的作者使用,它讓基礎(chǔ)代碼的作者不必為參數(shù)起一個(gè)固定的名字,參數(shù)名字調(diào)整也不會(huì)破壞調(diào)用者的代碼。沒(méi)有這個(gè)特性之前,有的調(diào)用者會(huì)對(duì)每個(gè)參數(shù)都以關(guān)鍵字參數(shù)的形式調(diào)用,這就導(dǎo)致了庫(kù)作者一改參數(shù)名,調(diào)用代碼就崩潰。
另外,還有的庫(kù)函數(shù)根本不適合用名字傳參,比如我們常見(jiàn)的add函數(shù),add(1, 2)明顯表意性要好于add(a=1, b=2),add的參數(shù)無(wú)論起什么名字,都感覺(jué)是多余的。
3、支持將編譯字節(jié)碼文件輸出到其他位置
Python項(xiàng)目中一個(gè)常見(jiàn)的麻煩就是清理git代碼庫(kù)中的pycache文件,這些文件往往是你一不小心就添加進(jìn)去了,清理起來(lái)卻頗為麻煩。Python 3.8支持通過(guò)設(shè)置環(huán)境變量 PYTHONPYCACHEPREFIX ,讓pycache生成到其他位置,而不跟.py文件混在一起。你在代碼中可以通過(guò) sys.pycache_prefix 查看生成的位置。
4、F字符串內(nèi)的'='表達(dá)式
在調(diào)試的時(shí)候,你是否經(jīng)常會(huì)寫這樣的代碼?
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'user={user} member_since={member_since}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
其中user={user},member_since={member_since}就是典型的樣板代碼。在Python 3.8中,你可以簡(jiǎn)寫為:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
一個(gè)等號(hào),f字符串就知道你需要在等號(hào)后面繼續(xù)把等號(hào)前面變量的值顯示出來(lái)。對(duì)于調(diào)試來(lái)說(shuō),這確實(shí)更加簡(jiǎn)潔了。
5、pickle協(xié)議5,獨(dú)立處理內(nèi)存中的數(shù)據(jù)緩存。
Python進(jìn)程之間傳輸數(shù)據(jù)時(shí),pickle是經(jīng)常用到的。對(duì)于數(shù)據(jù)量大的情況,妥善管理并優(yōu)化內(nèi)存使用是非常重要的。Python3.8 中對(duì)pickle的數(shù)據(jù)傳輸做了優(yōu)化,提高了性能和效率。
其他改動(dòng)
1、finally語(yǔ)句中可以有continue子句了,以前是不行的。
2、函數(shù)調(diào)用時(shí),f((keyword)=arg) 這種寫法不再允許了。
3、新增模塊importlib.metadata,用以讀取第三方包的信息。
◆ ◆ ◆ ◆ ◆
今日簽到口令:pf2x
以上就是小編總結(jié)的大家應(yīng)該會(huì)比較感興趣的特性和改動(dòng)了,如果您想查看完整的changelog,請(qǐng)?jiān)L問(wèn)這個(gè)地址(點(diǎn)擊閱讀原文也可以):
https://docs.python.org/3.9/whatsnew/3.8.html
總結(jié)
以上是生活随笔為你收集整理的python3.8新特性 逻辑表达式_Python3.8正式发布!新特性解析在这里的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql主主复制某张表_MySQL主主
- 下一篇: c语言0x00如何不截断_binary