Python減少程式碼量的兩個內建函式

前言

Python中內建了幾個非常好用的函式。

當你掌握了這幾個函式的用法後,有些場景下,不用自己去實現多餘的冗餘程式碼編寫,只需要呼叫這些函式,便能很簡短的幫你實現功能。

今天來分享下兩個函式的場景以及用法。

PS:下例子截圖演示均在 jupyter notebook 中完成。

enumerate

enumerate,單詞是列舉的意思。

列舉是什麼意思呢?來看下 Java 中的列舉,直接選自百度提問。這個例子舉得比較生動。

Python減少程式碼量的兩個內建函式

在你理解了列舉的意思後,來看下 Python 中

列舉函式

的使用場景。

場景:

在 Python 中,我們想去遍歷一個 list 列表,有哪種方式可以將列表中的元素全部打印出來呢?

假設現在有個 list ,其中包含了 1 - 5 五個數字,用程式將每個元素打印出來。

number_list = [1,2,3,4,5]

自行思考下,再繼續往後看。

方法一,直接 for 迴圈:

for num in number_list: print(num)

方法二, for + range() + len():

for i in range(len(number_list)): print(number_list[i])

不管哪種方式,你最終都能得到如下結果:

Python減少程式碼量的兩個內建函式

如果,現在讓你將列表中的每個元素和它對應的索引位置打印出來,如何做到?依然是自行思考下,再往後看。

是不是直接用第一種方法 for。。。in list 的方式,顯然不能完成。

而第二種方法可以完成,只需要如下:

Python減少程式碼量的兩個內建函式

但是這種方式是否覺得非常麻煩?你寫的程式碼既套用 range ,又需要套用 len,過於冗長。

此時,Python 內建函式 enumerate 完美的解決了這個場景下問題。

for i,num in enumerate(number_list): print(f‘當前索引位置:{i}’) print(f‘當前元素:{num}’)

Python減少程式碼量的兩個內建函式

對比下兩種方式,相信你會愛上第二種寫法:

Python減少程式碼量的兩個內建函式

用 enumerate 函式,遍歷出來的第一個變數是索引位置,第二個是結果,這二者順序不可顛倒,第一個變數一定是 int 型別的數字。至於變數的名字,想叫什麼叫什麼,沒有影響。

例子中 i,num 。你也可以替換成別的。

記住場景,就容易想到 enumerate 函數了,當你遍歷序列時,既想要序列對應索引位置,又想要序列中的內容,選它,enumerate() !

還記得序列的概念嗎?就是能遍歷的型別。

zip

看到 zip 這個單詞時,但凡用過壓縮包的同學都不陌生吧。

我們經常會看到,許多檔案都是 xxx。zip 的檔案格式,即壓縮包。

有了上述理解,來看下 zip 的場景。

場景:

有個男士列表,裡面分別是

黃曉明,劉愷威,賈乃亮。

有個女士列表,裡面分別是

楊穎,楊冪,李小璐。

能看出來,男士列表和女士列表,都是按照順序配對寫的。

如果將兩個 list 中的對應元素,將他們取出來組合成夫妻呢?

man_list = [‘黃曉明’,‘劉愷威’,‘賈乃亮’]woman_list = [‘楊穎’,‘楊冪’,‘李小璐’]

想要的結果:

[(‘黃曉明’,‘楊穎’),(‘劉愷威’,‘楊冪’),(‘賈乃亮’,‘李小璐’)]

自行思考,正常我們需要怎麼做,才能實現?

正常邏輯:

for i in range(len(man_list)): couple_list。append((man_list[i],woman_list[i]))print(couple_list)

遍歷第一個元素列表,獲取到索引的同時,將男女列表此時的索引元素組成元組,放入到 couple_list 中。

Python減少程式碼量的兩個內建函式

看下我們的 zip 函式:

zip可以將多個列表、元組或其它序列成對組合成一個元組列表。

所以,你只需要完美的將兩個元素傳入,最終轉為 list 即可:

couple_zip_list = list(zip(man_list,woman_list))print(couple_zip_list)

Python減少程式碼量的兩個內建函式

什麼叫做簡潔?一行程式碼搞定,有木有覺得就是這麼 easy 啊!

別急,正常場景,一般不會這麼巧的給你兩個同等元素列表,假設還有另外一個列表,我們將其定義為是否有孩子列表吧。

關注娛樂的朋友都知道,其實這三對夫妻都已經有孩子了,分別叫小海綿,小糯米,賈雲馨。

man_list = [‘黃曉明’,‘劉愷威’,‘賈乃亮’]woman_list = [‘楊穎’,‘楊冪’,‘李小璐’]has_child = [True,True]

現在有三個列表,依然是順序打包組合。最後來猜猜結果會如何呢?

Python減少程式碼量的兩個內建函式

看到,結果沒有最後一對夫妻的結果了。。。

zip雖然可以處理任意多的序列,但最終元素的個數取決於最短的序列。

逆向思維一下,如果 zip 能正向打包,是否可以逆向解包呢?

答案,當然是可以!zip解包 確實很神奇。

man_tuple,woman_tuple = zip(*couple_list)

注意,解包出來的型別是 tuple 而不是 list。

Python減少程式碼量的兩個內建函式

組合打法

上述介紹的兩個函式,可以結合使用,形成終極大招:

場景:

假設三人同時在一場婚禮上舉辦。

man_list = [‘黃曉明’, ‘劉愷威’, ‘賈乃亮’]woman_list = [‘楊穎’, ‘楊冪’, ‘李小璐’]

此時牧師要一次宣講,第幾對新人,男方是誰,女方是誰。。列印如下:

當前第1對夫妻: 男方:黃曉明, 女方:楊穎

所以,結合場景,組合今天介紹的 enumerate 和 zip 這樣使用,就能讓牧師完美的講出來。

for i, (man, woman) in enumerate(zip(man_list, woman_list)): print(f‘當前第{i+1}對夫妻: 男方:{man}, 女方:{woman}’)

Python減少程式碼量的兩個內建函式

總結

好了,簡單的回顧總結一下今天的內容。

第一個 enumerate 函式的場景,什麼時候會用到?當你既想要序列中的索引座標,又想要內容的時候!注意順序。

第二個 zip 函式的場景,什麼時候會用到?當你需要對多個序列同時進行遍歷的時候,用 zip 會省不少事!

特定場景下,結合兩種方法使用,可以達到神奇的效果。

總之,這兩種內建方法從使用角度來講,大大的降低了程式碼編寫的複雜度,非常友好。

關於今天分享的內容就到這裡啦,你學會了嘛?有什麼問題,可以評論區留言探討吶!