<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>

          ?Python 炫技操作(04):海象運(yùn)算符的三種用法

          共 2942字,需瀏覽 6分鐘

           ·

          2020-12-29 13:21


          點(diǎn)擊上方“Python編程時(shí)光”,選擇“加為星標(biāo)

          第一時(shí)間關(guān)注Python技術(shù)干貨!



          系列導(dǎo)讀

          Python 炫技操作(01):條件語(yǔ)句的七種寫法

          Python 炫技操作(02):合并字典的七種方法

          Python 炫技操作(03):連接列表的八種方法




          Python 版本發(fā)展非??欤缃褡钚碌陌姹疽呀?jīng)是 Pyhton 3.9,即便如此,有很多人甚至還停留在 3.6 或者 3.7,連 3.8 還沒(méi)用上。

          很多 Python 3.8 的特性還沒(méi)來(lái)得及了解,就已經(jīng)成為舊知識(shí)了,比如今天要說(shuō)的海象運(yùn)算符。

          海象運(yùn)算符是在 PEP 572 被提出的,直到 3.8 版本合入發(fā)布。

          它的英文原名叫 Assignment Expressions,翻譯過(guò)來(lái)也就是 賦值表達(dá)式,不過(guò)現(xiàn)在大家更普遍地稱之為海象運(yùn)算符,就是因?yàn)樗L(zhǎng)得真的太像海象了。

          1. 第一個(gè)用法:if/else

          可能有朋友是第一次接觸這個(gè)新特性,所以還是簡(jiǎn)單的介紹一下這個(gè)海象運(yùn)算符有什么用?

          在 Golang 中的條件語(yǔ)句可以直接在 if 中運(yùn)算變量的獲取后直接對(duì)這個(gè)變量進(jìn)行判斷,可以讓你少寫一行代碼

          import?"fmt"

          func?main()?{
          ????if?age?:=?20;age?>?18?{
          ????????fmt.Println("已經(jīng)成年了")
          ????}
          }

          若在 Python 3.8 之前,Python 必須得這樣子寫

          age?=?20
          if?age?>?18:
          ????print("已經(jīng)成年了")

          但有了海象運(yùn)算符之后,你可以和 Golang 一樣(如果你沒(méi)學(xué)過(guò) Golang,那這里要注意,Golang 中的 := 叫短變量聲明,意思是聲明并初始化,它和 Python 中的 := 不是一個(gè)概念)

          if?(age:=?20)?>?18:
          ????print("已經(jīng)成年了")

          2. 第二個(gè)用法:while

          在不使用 海象運(yùn)算符之前,使用 while 循環(huán)來(lái)讀取文件的時(shí)候,你也許會(huì)這么寫

          file?=?open("demo.txt",?"r")
          while?True:
          ????line?=?file.readline()
          ????if?not?line:
          ????????break
          ????print(line.strip())

          但有了海象運(yùn)算符之后,你可以這樣

          file?=?open("demo.txt",?"r")
          while?(line?:=?file.readline()):
          ????print(line.strip())

          使用它替換以往的無(wú)限 while 循環(huán)寫法更為驚艷

          比如,實(shí)現(xiàn)一個(gè)需要命令行交互輸入密碼并檢驗(yàn)的代碼,你也許會(huì)這樣子寫

          while?True:
          ???p?=?input("Enter?the?password:?")
          ???if?p?==?"youpassword":
          ??????break

          有了海象運(yùn)算符之后,這樣子寫更為舒服

          while?(p?:=?input("Enter?the?password:?"))?!=?"youpassword":
          ???continue

          3. 第三個(gè)用法:推導(dǎo)式

          這個(gè)系列的文章,幾乎每篇都能看到推導(dǎo)式的身影,這一篇依舊如此。

          在編碼過(guò)程中,我很喜歡使用推導(dǎo)式,在簡(jiǎn)單的應(yīng)用場(chǎng)景下,它簡(jiǎn)潔且不失高效。

          如下這段代碼中,我會(huì)使用列表推導(dǎo)式得出所有會(huì)員中過(guò)于肥胖的人的 bmi 指數(shù)

          members?=?[
          ????{"name":?"小五",?"age":?23,?"height":?1.75,?"weight":?72},
          ????{"name":?"小李",?"age":?17,?"height":?1.72,?"weight":?63},
          ????{"name":?"小陳",?"age":?20,?"height":?1.78,?"weight":?82},
          ]

          count?=?0

          def?get_bmi(info):
          ????global?count
          ????count?+=?1

          ????print(f"執(zhí)行了?{count}?次")

          ????height?=?info["height"]
          ????weight?=?info["weight"]

          ????return?weight?/?(height**2)

          #?查出所有會(huì)員中過(guò)于肥胖的人的?bmi?指數(shù)
          fat_bmis?=?[get_bmi(m)?for?m?in?members?if?get_bmi(m)?>?24]

          print(fat_bmis)

          輸出如下

          執(zhí)行了?1?次
          執(zhí)行了?2?次
          執(zhí)行了?3?次
          執(zhí)行了?4?次
          [25.88057063502083]

          可以看到,會(huì)員數(shù)只有 3 個(gè),但是 get_bmi 函數(shù)卻執(zhí)行了 4 次,原因是在判斷時(shí)執(zhí)行了 3 次,而在構(gòu)造新的列表時(shí)又重復(fù)執(zhí)行了一遍。

          如果所有會(huì)員都是過(guò)于肥胖的,那最終將執(zhí)行 6 次,這種在大量的數(shù)據(jù)下是比較浪費(fèi)性能的,因此對(duì)于這種結(jié)構(gòu),我通常會(huì)使用傳統(tǒng)的for 循環(huán) + if 判斷。

          fat_bmis?=?[]

          #?查出所有會(huì)員中過(guò)于肥胖的人的?bmi?指數(shù)
          for?m?in?members:
          ????bmi?=?get_bmi(m)
          ????if?bmi?>?24:
          ????????fat_bmis.append(bmi)

          在有了海象運(yùn)算符之后,你就可以不用在這種場(chǎng)景下做出妥協(xié)。

          #?查出所有會(huì)員中過(guò)于肥胖的人的?bmi?指數(shù)
          fat_bmis?=?[bmi?for?m?in?members?if?(bmi?:=?get_bmi(m))?>?24]

          最終從輸出結(jié)果可以看出,只執(zhí)行了 3 次

          執(zhí)行了?1?次
          執(zhí)行了?2?次
          執(zhí)行了?3?次
          [25.88057063502083]

          這里僅介紹了列表推導(dǎo)式,但在字典推導(dǎo)式和集合推導(dǎo)式中同樣適用。不再演示。

          海象運(yùn)算符,是一個(gè)新奇的特性,有不少人覺(jué)得這樣這種特性會(huì)破壞代碼的可讀性。確實(shí)在一個(gè)新鮮事物剛出來(lái)時(shí)是會(huì)這樣,但我相信經(jīng)過(guò)時(shí)間的沉淀后,越來(lái)越多的人使用它并享受它帶來(lái)的便利時(shí),這種爭(zhēng)議也會(huì)慢慢消失在歷史的長(zhǎng)河中。

          明哥原創(chuàng)文都已傳至 Github:https://github.com/iswbm/PythonCodingTime

          本文永久博客鏈接:http://python.iswbm.com/en/latest/c01/c01_42.html


          最后,想看更多這個(gè)系列的朋友,請(qǐng)幫忙?轉(zhuǎn)發(fā)文章、或者?點(diǎn)個(gè)在看,只有看的人多了,我的更新速度也才能快起來(lái)。



          推薦閱讀



          “Hack”微信實(shí)戰(zhàn):如何用Python分析微信群聊記錄

          OrderedDict是如何保證Key的插入順序的?

          Python炫技操作(03):連接列表的八種方法

          用動(dòng)畫展示Pycharm十大實(shí)用技巧

          一文學(xué)會(huì)制作6種炫酷的Python動(dòng)態(tài)圖

          一份可以令 Python 變快的工具清單




          長(zhǎng)按下圖? ?? ?關(guān)注博主

          (按左邊關(guān)注?Python, 按右邊關(guān)注?Goalng


          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  午夜操一操网 | 黄色精品 | 久久久久久久久久久久久久精 | 免费男女激情内射视频网站大全 | 一本道无码在线 |