前言
Python中內(nèi)置了幾個非常好用的函數(shù),。
當(dāng)你掌握了這幾個函數(shù)的用法后,有些場景下,,不用自己去實(shí)現(xiàn)多余的冗余代碼編寫,,只需要調(diào)用這些函數(shù),便能很簡短的幫你實(shí)現(xiàn)功能,。
今天來分享下兩個函數(shù)的場景以及用法,。
PS:下例子截圖演示均在 jupyter notebook 中完成。
enumerate
enumerate,,單詞是枚舉的意思,。
枚舉是什么意思呢?來看下 Java 中的枚舉,,直接選自百度提問,。這個例子舉得比較生動。
在你理解了枚舉的意思后,,來看下 Python 中枚舉函數(shù)的使用場景,。
場景:
在 Python 中,我們想去遍歷一個 list 列表,,有哪種方式可以將列表中的元素全部打印出來呢,?
假設(shè)現(xiàn)在有個 list ,其中包含了 1 - 5 五個數(shù)字,,用程序?qū)⒚總€元素打印出來,。
number_list = [1,2,3,4,5]
自行思考下,再繼續(xù)往后看,。
方法一,,直接 for 循環(huán):
for num in number_list:print(num)
方法二,, for + range() + len():
for i in range(len(number_list)):print(number_list[i])
不管哪種方式,你最終都能得到如下結(jié)果:
如果,,現(xiàn)在讓你將列表中的每個元素和它對應(yīng)的索引位置打印出來,,如何做到?依然是自行思考下,,再往后看,。
是不是直接用第一種方法 for...in list 的方式,顯然不能完成,。
而第二種方法可以完成,,只需要如下:
但是這種方式是否覺得非常麻煩?你寫的代碼既套用 range ,,又需要套用 len,,過于冗長。
此時,,Python 內(nèi)置函數(shù) enumerate 完美的解決了這個場景下問題,。
for i,num in enumerate(number_list):print(f'當(dāng)前索引位置:{i}')print(f'當(dāng)前元素:{num}')
對比下兩種方式,相信你會愛上第二種寫法:
用 enumerate 函數(shù),,遍歷出來的第一個變量是索引位置,,第二個是結(jié)果,這二者順序不可顛倒,,第一個變量一定是 int 類型的數(shù)字,。至于變量的名字,想叫什么叫什么,,沒有影響,。
例子中 i,num ,。你也可以替換成別的,。
記住場景,就容易想到 enumerate 函數(shù)了,,當(dāng)你遍歷序列時,,既想要序列對應(yīng)索引位置,又想要序列中的內(nèi)容,,選它,,enumerate() !
還記得序列的概念嗎,?就是能遍歷的類型,。
zip
看到 zip 這個單詞時,但凡用過壓縮包的同學(xué)都不陌生吧,。
我們經(jīng)常會看到,,許多文件都是 xxx.zip 的文件格式,即壓縮包,。
有了上述理解,,來看下 zip 的場景。
場景:
有個男士列表,,里面分別是 黃曉明,,劉愷威,賈乃亮,。
有個女士列表,,里面分別是 楊穎,楊冪,,李小璐,。
能看出來,男士列表和女士列表,,都是按照順序配對寫的,。
如果將兩個 list 中的對應(yīng)元素,將他們?nèi)〕鰜斫M合成夫妻呢,?
man_list = ['黃曉明','劉愷威','賈乃亮']woman_list = ['楊穎','楊冪','李小璐']
想要的結(jié)果:
[('黃曉明','楊穎'),('劉愷威','楊冪'),('賈乃亮','李小璐')]
自行思考,,正常我們需要怎么做,才能實(shí)現(xiàn),?
正常邏輯:
for i in range(len(man_list)):couple_list.append((man_list[i],woman_list[i]))print(couple_list)
遍歷第一個元素列表,,獲取到索引的同時,將男女列表此時的索引元素組成元組,,放入到 couple_list 中,。
看下我們的 zip 函數(shù):
zip可以將多個列表、元組或其它序列成對組合成一個元組列表,。
所以,,你只需要完美的將兩個元素傳入,最終轉(zhuǎn)為 list 即可:
couple_zip_list = list(zip(man_list,woman_list))print(couple_zip_list)
什么叫做簡潔,?一行代碼搞定,,有木有覺得就是這么 easy 啊,!
別急,,正常場景,一般不會這么巧的給你兩個同等元素列表,,假設(shè)還有另外一個列表,,我們將其定義為是否有孩子列表吧。
關(guān)注娛樂的朋友都知道,,其實(shí)這三對夫妻都已經(jīng)有孩子了,,分別叫小海綿,,小糯米,賈云馨,。
man_list = ['黃曉明','劉愷威','賈乃亮']woman_list = ['楊穎','楊冪','李小璐']has_child = [True,True]
現(xiàn)在有三個列表,,依然是順序打包組合。最后來猜猜結(jié)果會如何呢,?
看到,,結(jié)果沒有最后一對夫妻的結(jié)果了。,。,。
zip雖然可以處理任意多的序列,但最終元素的個數(shù)取決于最短的序列,。
逆向思維一下,,如果 zip 能正向打包,是否可以逆向解包呢,?
答案,,當(dāng)然是可以!zip解包 確實(shí)很神奇,。
man_tuple,woman_tuple = zip(*couple_list)
注意,,解包出來的類型是 tuple 而不是 list。
組合打法
上述介紹的兩個函數(shù),,可以結(jié)合使用,,形成終極大招:
場景:
假設(shè)三人同時在一場婚禮上舉辦。
man_list = ['黃曉明', '劉愷威', '賈乃亮']woman_list = ['楊穎', '楊冪', '李小璐']
此時牧師要一次宣講,,第幾對新人,,男方是誰,女方是誰,。,。打印如下:
當(dāng)前第1對夫妻: 男方:黃曉明, 女方:楊穎
所以,結(jié)合場景,,組合今天介紹的 enumerate 和 zip 這樣使用,,就能讓牧師完美的講出來。
for i, (man, woman) in enumerate(zip(man_list, woman_list)):print(f'當(dāng)前第{i+1}對夫妻: 男方:{man}, 女方:{woman}')
總結(jié)
好了,,簡單的回顧總結(jié)一下今天的內(nèi)容,。
第一個 enumerate 函數(shù)的場景,什么時候會用到,?當(dāng)你既想要序列中的索引坐標(biāo),,又想要內(nèi)容的時候!注意順序。
第二個 zip 函數(shù)的場景,,什么時候會用到,?當(dāng)你需要對多個序列同時進(jìn)行遍歷的時候,用 zip 會省不少事,!
特定場景下,,結(jié)合兩種方法使用,可以達(dá)到神奇的效果,。
總之,這兩種內(nèi)置方法從使用角度來講,,大大的降低了代碼編寫的復(fù)雜度,,非常友好。