91aaa在线国内观看,亚洲AV午夜福利精品一区二区,久久偷拍人视频,久久播这里有免费视播

<strong id="fvuar"></strong>

  • <sub id="fvuar"><dl id="fvuar"><em id="fvuar"></em></dl></sub>

    1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

      手機(jī)站
      千鋒教育

      千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

      千鋒教育

      掃一掃進(jìn)入千鋒手機(jī)站

      領(lǐng)取全套視頻
      千鋒教育

      關(guān)注千鋒學(xué)習(xí)站小程序
      隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

      當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > Python之詳解enumerate和zip

      Python之詳解enumerate和zip

      來(lái)源:千鋒教育
      發(fā)布人:xqq
      時(shí)間: 2023-11-07 12:18:21 1699330701

      首先介紹的是enumerate函數(shù)。

      在我們?nèi)粘>幊痰倪^(guò)程當(dāng)中,經(jīng)常會(huì)遇到一個(gè)問(wèn)題。

      在C語(yǔ)言以及一些古老的語(yǔ)言當(dāng)中是沒(méi)有迭代器這個(gè)概念的,所以我們要遍歷數(shù)組或者是容器的時(shí)候,往往只能通過(guò)下標(biāo)。有了迭代器之后,我們遍歷的過(guò)程方便了很多,我們可以直接用一個(gè)變量去迭代一個(gè)容器當(dāng)中的值。最簡(jiǎn)單的例子就是數(shù)組的遍歷,比如我們要遍歷items這個(gè)數(shù)組。我們可以直接:

      foriteminitems:

      通過(guò)迭代器的方式我們可以很輕松地遍歷數(shù)組,而不再需要下標(biāo),也不需要計(jì)算數(shù)組的長(zhǎng)度了。但是如果我們?cè)谘h(huán)體當(dāng)中需要知道元素的下標(biāo)該怎么辦?

      難道我們真的只能在下標(biāo)和迭代器當(dāng)中選擇一個(gè)嗎,比如在循環(huán)體的外面添加一個(gè)變量來(lái)記錄下標(biāo)?

      idx=0

      foriteminitems:

      operation()

      idx+=1

      這樣可以解決問(wèn)題,但是很麻煩,一點(diǎn)也不簡(jiǎn)潔,用專(zhuān)業(yè)的話來(lái)說(shuō)一點(diǎn)也不pythonic(符合Python標(biāo)準(zhǔn)的代碼)。為了追求pythonic,于是有了enumerate函數(shù),來(lái)解決了我們又想直接迭代又需要知道元素下標(biāo)的情形。

      它的用法也很簡(jiǎn)單,我們把需要迭代的對(duì)象或者迭代器傳入enumerate函數(shù)當(dāng)中,它會(huì)為我們創(chuàng)建一個(gè)新的迭代器,同時(shí)返回下標(biāo)以及迭代的內(nèi)容。我們來(lái)看一個(gè)例子:

      fori,iteminenumerate(items):

      除此之外,enumerate還支持傳入?yún)?shù)。比如在某些場(chǎng)景當(dāng)中,我們希望下標(biāo)從1開(kāi)始,而不再是0開(kāi)始,我們可以額外多傳入一個(gè)參數(shù)實(shí)現(xiàn)這點(diǎn):

      fori,iteminenumerate(items,1):

      循環(huán)是我們編程的時(shí)候必不可少的操作,也正因此,enumerate函數(shù)使用非常廣泛。但是有一點(diǎn)需要注意,如果我們迭代的是一個(gè)多元組數(shù)組,我們需要注意要將index和value區(qū)分開(kāi)。舉個(gè)例子:

      data=[(1,3),(2,1),(3,3)]

      在不用enumerate的時(shí)候,我們有兩種迭代方式,這兩種都可以運(yùn)行。

      forx,yindata:

      for(x,y)indata:

      但是如果我們使用enumerate的話,由于引入了一個(gè)index,我們必須要做區(qū)分,否則會(huì)報(bào)錯(cuò),所以我們只有一種迭代方式:

      fori,(x,y)inenumerate(data):

      zip接下來(lái)要介紹的另一個(gè)函數(shù)同樣是方便我們迭代的,不過(guò)它針對(duì)的是另一個(gè)場(chǎng)景——多對(duì)象迭代。

      它的應(yīng)用場(chǎng)景非常簡(jiǎn)單,就是我們想要同時(shí)迭代多份數(shù)據(jù),比如用戶(hù)的名字和用戶(hù)的職業(yè)數(shù)據(jù)是分開(kāi)的,我們希望同時(shí)遍歷一個(gè)用戶(hù)的職業(yè)和名字。如果不使用zip,我們可能只能放棄迭代器回到傳統(tǒng)的下標(biāo)遍歷的模式了。這樣當(dāng)然是可以的,不過(guò)有兩個(gè)小問(wèn)題,第一個(gè)小問(wèn)題當(dāng)然是代碼的可讀性變差了,不夠pythonic,第二個(gè)問(wèn)題是我們需要維護(hù)兩個(gè)容器長(zhǎng)度不一樣的情況,會(huì)增加額外的代碼。而使用zip,可以同時(shí)解決以上兩個(gè)問(wèn)題。

      我們來(lái)看一個(gè)例子:

      names=['xiaoming','xiaohua','xiaohei','xiaoli']

      jobs=['coach','student','student','student','professor']

      forname,jobinzip(names,jobs):

      print(name,job)

      最后輸出的結(jié)果是人名和職業(yè)的tuple:

      xiaomingcoach

      xiaohuastudent

      xiaoheistudent

      xiaolistudent

      上面舉的例子當(dāng)中,names和jobs的長(zhǎng)度其實(shí)是不一致的,在使用了zip的情況下,會(huì)自動(dòng)替我們按照其中較短的那個(gè)進(jìn)行截?cái)?。如果我們不希望截?cái)?,我們也可以使用itertools下的zip_longest來(lái)代替zip:

      fromitertoolsimportzip_longest

      forname,jobinzip_longest(names,jobs):

      這樣的話長(zhǎng)度不夠的元素會(huì)以None來(lái)填充,zip_longest提供了一個(gè)參數(shù)fillvalue,可以填充成我們指定的值。

      無(wú)論是zip還是zip_longest,都可以支持多迭代器的遍歷。比如:

      names=['xiaoming','xiaohua','xiaohei','xiaoli']

      jobs=['coach','student','student','student','professor']

      hobbies=['footbal','tennis','badminton','basketbal']

      forname,job,hobbyinzip(names,jobs,hobbies):

      print(name,job,hobby)

      zip除了方便我們迭代遍歷之外,另一個(gè)很大的用處是可以很方便地生成dict。比如剛才的例子當(dāng)中,我們想生成一個(gè)名稱(chēng)和職業(yè)的dict,一般的辦法當(dāng)然是先定義一個(gè)dict,然后遍歷所有的key和value,來(lái)生成dict。然而使用zip,我們可以將這個(gè)操作簡(jiǎn)化到一行代碼:

      jobDict=dict(zip(names,jobs))

      需要注意的是,我們調(diào)用zip返回的結(jié)果其實(shí)是一個(gè)迭代器,我們?cè)谵D(zhuǎn)化成dict的時(shí)候自動(dòng)遍歷了迭代器當(dāng)中的內(nèi)容。比如我們?nèi)绻苯哟蛴〕鰖ip調(diào)用結(jié)果的話,就會(huì)發(fā)現(xiàn)屏幕上輸出的是一個(gè)迭代器的地址:

      print(zip(names,jobs))

      >>>

      我們想要獲得它的內(nèi)容,需要將它手動(dòng)轉(zhuǎn)成list:

      print(list(zip(names,jobs)))

      >>>[('xiaoming','coach'),('xiaohua','student'),('xiaohei','student'),('xiaoli','student')]

      無(wú)論是enumerate還是zip其實(shí)底層都是基于迭代器實(shí)現(xiàn)的,從原理上來(lái)說(shuō)并沒(méi)有什么太深?yuàn)W的內(nèi)容,而且我們不使用它們也不影響我們寫(xiě)代碼。但是Python之所以是Python,之所以很多人稱(chēng)道它簡(jiǎn)潔的語(yǔ)言和邏輯,離不開(kāi)我們廣泛地使用這些簡(jiǎn)化代碼邏輯的工具和方法。因此我們加以了解是非常有必要的,希望大家都能寫(xiě)出pythonic的代碼,不僅寫(xiě)代碼能力強(qiáng),而且代碼本身也漂亮。

      以上內(nèi)容為大家介紹了Python之詳解enumerate和zip,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。

      聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
      10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
      請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
      免費(fèi)領(lǐng)取
      今日已有369人領(lǐng)取成功
      劉同學(xué) 138****2860 剛剛成功領(lǐng)取
      王同學(xué) 131****2015 剛剛成功領(lǐng)取
      張同學(xué) 133****4652 剛剛成功領(lǐng)取
      李同學(xué) 135****8607 剛剛成功領(lǐng)取
      楊同學(xué) 132****5667 剛剛成功領(lǐng)取
      岳同學(xué) 134****6652 剛剛成功領(lǐng)取
      梁同學(xué) 157****2950 剛剛成功領(lǐng)取
      劉同學(xué) 189****1015 剛剛成功領(lǐng)取
      張同學(xué) 155****4678 剛剛成功領(lǐng)取
      鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
      董同學(xué) 138****2867 剛剛成功領(lǐng)取
      周同學(xué) 136****3602 剛剛成功領(lǐng)取
      相關(guān)推薦HOT