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