最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析PEP572: 海象運算符

 更新時間:2019年10月15日 08:53:28   作者:小明  
PEP572的標(biāo)題是「Assignment Expressions」,也就是「賦值表達(dá)式」,也叫做「命名表達(dá)式」,不過它現(xiàn)在被廣泛的別名是「海象運算符」(The Walrus Operator)

現(xiàn)在已經(jīng)是Python 3.8的最后一個alpha版本,接著就是本月底要發(fā)布的的3.8.0 beta 1了。按規(guī)定,3.8已經(jīng)不會再添加(修改)功能了,之前非常有爭議的PEP 572的實現(xiàn)已經(jīng)算是很固定了,我們這篇文章就來先嘗個鮮??纯催@個新的賦值表達(dá)式語法怎么用,何時用。

海象運算符

PEP572的標(biāo)題是「Assignment Expressions」,也就是「賦值表達(dá)式」,也叫做「命名表達(dá)式」,不過它現(xiàn)在被廣泛的別名是「海象運算符」(The Walrus Operator)。因為:=很像海象「眼睛小,長著兩枚長長的牙」這個特點^_^。

語法和語義

我們不詳細(xì)介紹PEP的內(nèi)容,直接說應(yīng)用場景。我覺得它主要可以用在2個地方

賦值給中間變量

這個小標(biāo)題想了很久,沒找到更合適能表達(dá)的。不過相信通過2個例子相信大家就能理解了。

首先是一個正則匹配的例子:

pattern = re.compile('s')
data = 'ss'
if pattern.match(data):
  print(pattern.match(data).group(0))

如果能匹配到條件,match 對象才會有g(shù)roup 方法。但是這樣寫雖然節(jié)省到一行代碼卻讓執(zhí)行變慢了,因為重復(fù)地執(zhí)行了2次re.match(data)。正確的寫法是:

match = pattern.match(data)
if match:
  print(match.group(0))

代碼也就只能寫成這樣了,但如果使用賦值表達(dá)式:

if (match := pattern.match(data)) is not None:
  print(match.group(0))

本來if這種控制結(jié)構(gòu)語句只是求值表達(dá)式,看結(jié)果是不是符合條件。而在這里,它做了3件事:

  • 對表達(dá)式pattern.match(data)求值
  • 把值的結(jié)果賦值給match
  • 把match 作為if的條件,判斷它的值是不是None

我對它的理解是: 求值過程中也賦值了新的中間變量,這個(些)中間變量(如這里的match)可以在代碼塊中被繼續(xù)使用。

再看一個文件讀取的例子:

while 1:
  line = fp.readline()
  if not line:
    break
  print(line)

現(xiàn)在可以直接寫成:

while (line := fp.readline()):
  print(line)

這可以說是一種代碼風(fēng)格的改進了。

簡化列表解析

列表解析性能好,而且非常 pythonic,但是它應(yīng)用場景有限,我們看個例子:

results = []
for x in data:
  result = f(x)
  if result:
    results.append(result)

這是一個日常開發(fā)里面比較常見的結(jié)構(gòu)?,F(xiàn)在是不能用列表解析的,不信的話下面的方案:

results = [
  f(x) for x in data
  if f(x)
]

這個是錯誤的,每次循環(huán)執(zhí)行了2 次f函數(shù)?,F(xiàn)在用賦值表達(dá)式可以寫成:

results = [
  y for x in data
  if (y := f(x))
]

可以用列表解析了!

再看一個PEP提的例子:

stuff = [[y := f(x), x/y] for x in range(5)]

其實又回到了賦值給中間變量這個點,每一項包含了y,以及要用y才能獲得結(jié)果的x/y。

上面說的就是海象運算符能實現(xiàn)的目的了~

Golang里面的:=

:=并不是Python首創(chuàng)的,Golang里面有一個短變量聲明(Short variable declarations)語法:

// ShortVarDecl = IdentifierList ":=" ExpressionList .
i, j := 0, 10
f := func() int { return 7 }

func f(n int) (res int, err error) {
  if _, err := f(n-1); err != nil {
    return
  }
  return
}

:=的作用是替代 var 定義,聲明時不需要指定類型。同時由于語言設(shè)計,和Python的賦值表達(dá)式一樣,如上面的例子,f(n-1)的第二個返回值err可以被后面的err != nil使用,用來判斷條件是否成立,我非常喜歡!

我對PEP 572的看法

在之前我曾經(jīng)在知乎回答過「如何看待 PEP 572 ?」這個問題,當(dāng)時我這么說:

這個PEP 有明確的 Recommended use-cases, 在正確的地方使用,而不是濫用,當(dāng)然不喜歡的可以不用,用舊的形式。我語言提供了更多特性和選擇的機會,但控制權(quán)是開發(fā)者手里的,就像元類、描述符、dataclass 甚至裝飾器等等都是有適用場景的。

有人覺得它不符合Python之禪,其實我個人感覺挺好的呀?,F(xiàn)在PEP 572的實現(xiàn)已經(jīng)合并到Python3.8,試用下來非常贊。

Dustin Ingram在PyCON2019上做了一個《PEP 572: The Walrus Operator》的分享,最后他也說自己不喜歡這個語法,但是他接著說:

You might say well i don't like it, that's totally fine. you don't have to like it if you don't like it then don't write it

我覺得說的非常好,沒人強制你必須使用它~

好了,本文就給大家介紹到這里,希望對大家有所幫助!

相關(guān)文章

  • Python如何實現(xiàn)文本轉(zhuǎn)語音

    Python如何實現(xiàn)文本轉(zhuǎn)語音

    文本轉(zhuǎn)語音,一般會用在無障礙開發(fā)。下面介紹如何使用Python實現(xiàn)將文本文件轉(zhuǎn)換成語音輸出。跟著小編一起來看看吧。
    2016-08-08
  • pycharm使用sftp同步服務(wù)器的步驟

    pycharm使用sftp同步服務(wù)器的步驟

    這篇文章主要介紹了pycharm使用sftp同步服務(wù)器,其實完全可以結(jié)合frp進行內(nèi)網(wǎng)穿透,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 一文教會你用python裁剪圖片

    一文教會你用python裁剪圖片

    Python語言的圖片處理使我們常常使用的方面,那么我們該如何實現(xiàn)圖片的剪切呢?下面這篇文章主要給大家介紹了關(guān)于用python裁剪圖片的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • ?Java?SE?面向?qū)ο缶幊痰?個常用接口

    ?Java?SE?面向?qū)ο缶幊痰?個常用接口

    這篇文章主要f?Java?SE?面向?qū)ο缶幊痰?個常用接口,Comparable、Comparator?比較器、Cloneable,下面文章詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-01-01
  • Python數(shù)據(jù)可視化Pyecharts制作Heatmap熱力圖

    Python數(shù)據(jù)可視化Pyecharts制作Heatmap熱力圖

    這篇文章主要介紹了Python數(shù)據(jù)可視化Pyecharts制作Heatmap熱力圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Python實現(xiàn)24點小游戲

    Python實現(xiàn)24點小游戲

    這篇文章主要為大家詳細(xì)介紹了Python實現(xiàn)24點小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python簡單計算文件MD5值的方法示例

    Python簡單計算文件MD5值的方法示例

    這篇文章主要介紹了Python簡單計算文件MD5值的方法,涉及Python文件讀取、hash運算及md5加密等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • Python遞歸求出列表(包括列表中的子列表)的最大值實例

    Python遞歸求出列表(包括列表中的子列表)的最大值實例

    今天小編就為大家分享一篇Python遞歸求出列表(包括列表中的子列表)的最大值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 詳解Python讀取和寫入操作CSV文件的方法

    詳解Python讀取和寫入操作CSV文件的方法

    CSV 文件(逗號分隔值文件)是一種純文本文件,它使用特定的結(jié)構(gòu)來排列表格數(shù)據(jù)。本文將詳細(xì)介紹Python中讀取個寫入操作CSV文件的方法,需要的可以參考一下
    2022-03-03
  • 在Django中管理Users和Permissions以及Groups的方法

    在Django中管理Users和Permissions以及Groups的方法

    這篇文章主要介紹了在Django中管理Users和Permissions以及Groups的方法,Django是最具人氣的Python web開發(fā)框架,需要的朋友可以參考下
    2015-07-07

最新評論

山阴县| 张北县| 曲麻莱县| 德保县| 西乡县| 塘沽区| 沽源县| 金门县| 嘉定区| 凌源市| 桦甸市| 藁城市| 乐山市| 灵璧县| 乐东| 甘孜县| 红安县| 临泉县| 宜君县| 汝阳县| 厦门市| 台湾省| 汝州市| 靖远县| 邵东县| 慈利县| 图木舒克市| 汝城县| 新和县| 松滋市| 堆龙德庆县| 盱眙县| 岳阳县| 荔波县| 广灵县| 龙口市| 贡觉县| 井陉县| 东山县| 宜黄县| 吴川市|