巧用Python高階函式,秒提程式碼逼格

Python以簡單易學,語法簡潔易懂,編碼優美規範的特點,受到很多程式設計師和普通人的喜愛,相信和我一樣,有很多人在學過Python之後就對其愛不釋手了吧,今天給大家分享幾個常用的高階函式,瞬間提升程式碼逼格,成為一個有深度、有內涵的Python程式設計師!

巧用Python高階函式,秒提程式碼逼格

all( )

all()方法用於判斷給定的可迭代引數 iterable 中的所有元素是否都為 True,如果是返回True,否則返回False

舉個例子:

已知有如下所示arr這樣一個列表資料:

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

>>

判斷arr列表中的資料是否都大於0

all(i > 0 for i in arr)=> True

明顯一眼就可以看出1-5這幾個資料明顯都是大於0的,所以自然返回True!

>>

判斷arr列表中的資料是否都小於4

all( i < 4 for i in arr)=> False

明顯的5大於4,有一個不符合條件,所以返回False!

filter()

filter方法返回滿足條件的列表中所有元素的新列表。此方法接受

一個函式

一個可迭代的引數

。但是,filter方法返回一個過濾器物件而不是一個列表。因此,我們必須將過濾器物件轉換為列表。

舉個例子:

還是以開始的arr列表為例:

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

>>

返回arr列表中所有大於2的資料,組成新的列表

def filter_function(x): return x > 2

我們定義一個這樣的函式,返回arr列表中所有大於2的數!

>>

利用filter方法返回,注意第一個引數為函式,第二個為可迭代的引數!

list(filter(filter_function, arr))=> [3, 4, 5]

這裡注意,我們在filter方法的最外層加了一個list方法,這是因為在python3中,filter方法返回的是一個過濾器物件,必須將這個物件轉換為列表,最開始的時候我們已經講到了!

使用匿名函式lambda一行寫完所有,更簡潔,更有逼格:

list(filter(lambda x: x > 2, arr))=> [3, 4, 5]

這裡大家可以先了解一下lambda這個匿名函式的用法,準確的來說它更像是一個表示式,只能封裝有限的邏輯進去!

>>

還有沒有更好的辦法呢?

前面的過濾器已經可以很好的工作,但是由於filter必須將函式作為引數傳遞,因此可能會有些混亂。Python提供了一個很棒的功能,稱為

列表理解功能

,該功能在過濾時被更廣泛地使用。

arr = [1, 2, 3, 4 5] [x for x in arr if x > 2] => [3, 4, 5]

用法:

最外層用直接用[]第一個x為返回值是便利列表的結果,第二個寫迴圈遍歷,第三個x > 2就是條件了!是不是更加一目瞭然!但是這隻適用簡單的條件判斷,如果有更加複雜的業務邏輯,可能filter更適合一些!

next()

next方法返回滿足條件的列表的第一個元素。這類似於其他語言中的find方法。Next接受iterable作為引數。請參閱以下示例:

舉個例子

還是以arr為例,找出arr中大於2的第1個數

arr = [1, 2, 3, 4, 5] next(x for x in arr if x > 2) => 3

注意:

如果Python在列表中找不到該元素,則將引發StopIteration異常,如果處理不正確,則可能導致程式崩潰。因此,next方法允許設定預設值,直接傳到第二個引數即可。

arr = [1, 2, 3, 4, 5] next(x for x in arr if x > 5) => StopIteration # 注意這裡的寫法與上邊的不同 next((x for x in arr if x > 5), None) => None

提示:

不要忘記將迭代器放在括號中。否則會導致語法錯誤。

in

in是python中很重要的一個關鍵字,並不是一個方法,主要用來檢查陣列中是否存在元素。

舉個例子:

arr = [1, 2, 3, 4, 5] 1 in arr => True 6 in arr => False

迴圈遍歷

為了對陣列的每個元素執行操作,Python提供了for迴圈。請參閱以下示例:

arr = [1, 2, 3, 4, 5] for x in arr:   print(f‘Hello, I am {x}’) => Hello, I am 1 Hello, I am 2 Hello, I am 3 Hello, I am 4 Hello, I am 5

重要的是要注意,更改x的值不會更改原始列表。

arr = [1, 2, 3, 4, 5]  for x in arr:   x = x * 2 print(arr) => [1, 2, 3, 4, 5]

有一種方法可以返回更新的列表。但是,與for迴圈相比,map(我們將在下面討論)是一個更好的選擇。for迴圈應該主要用於對列表中的每個專案進行外部操作。

map()

map方法返回一個新列表,其中所有元素均由函式轉換。此方法接受兩個引數:

函式

可迭代

。與filter類似,map方法返回一個map物件,因此我們必須將該map物件轉換為一個列表。請參閱以下示例:

arr = [1, 2, 3, 4, 5] def square(x):   return x * x # list將map物件轉換為列表,map第一個引數為函式,第二個為可迭代元素 list(map(square, arr)) => [1, 4, 9, 16, 25] # Alternatively。。。 list(map(lambda x: x * x, arr))

但是,就像前邊學過的filter方法一樣,還可以使用

列表理解

來解決此問題。請參閱以下示例:

arr = [1, 2, 3, 4, 5] [x * x for x in arr] => [1, 4, 9, 16, 25]

同樣,列表理解是首選方法,顯得更加“ Python”。

reduce()

reduce方法將會對引數序列中元素進行累積。接受兩個必需引數和一個可選引數。第一個必需的引數,是一個函式,並且整函式必須有兩個引數。第二個引數是列表元素。第三個是可選的開始引數。此外,reduce函式需要Python庫functools,因此請不要忘記匯入該庫。看到這段文字我相信你肯定會懵逼,不過沒關係,我們還是來舉個例子,來幫助大家來理解!

舉個例子:

還是以arr為例,計算出所有資料相乘的結果!

import functools def square_reducer(x, y):   return x * y arr = [1, 2, 3, 4, 5] # 計算1*2*3*4*5的結果 functools。reduce(square_reducer, arr) => 120 # 加入第三個可選引數,開始計算的數 # 計算順序是2*1*2*3*4*5,後邊設定的第三個引數2就是從2開始計算 functools。reduce(square_reducer, arr, 2) => 240

第一個reduce函式是最簡單的。首先,我們轉到第一個元素並將其放入累加器(x)。然後,將累加器乘以第二個元素。所以1 * 2 =2。我們的累加器值為2。接下來,我們將累加器值乘以第三個元素(2 * 3)。因此,我們得到的值為6。我們一直進行下去,直到完成遍歷整個陣列為止。最後,這是正在發生的事情:

1 * 2 * 3 * 4 * 5 => 120

傳入第三個可選引數,功能與第一個功能相同,但是它從將累加器設定為2開始。

2 * 1 * 2 * 3 * 4 * 5 => 240

再用我們學過的匿名函式lambda來實現一遍,複習一下!

functools。reduce(lambda x, y: x * y, arr) => 120 functools。reduce(lambda x, y: x * y, arr, 2) => 240

這裡使用了lambda函式,因此我們不必單獨宣告reducer方法,其結果功能都是一樣的,只是這樣更加簡潔美觀。

sort()

sort是應用在 list 上的方法,sorted可以對所有可迭代的物件進行排序操作。

list 的 sort方法返回的是對已經存在的列表進行操作,無返回值,而內建函式 sorted方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。sorted方法接受一個必需的引數和兩個可選的引數(反向和鍵)。第一個引數是列表。reverse可選引數將對排序後的列表進行反轉,而key可選引數是將列表進行排序的函式。請參閱以下示例:

arr = [2, 1, 5, 3, 4] sorted(arr) => [1, 2, 3, 4, 5] sorted(arr, reverse=True) => [5, 4, 3, 2, 1] students = [  {‘name’: ‘Jimmy’, ‘age’: 15},  {‘name’: ‘Hector’, ‘age’: 18},  {‘name’: ‘Paige’, ‘age’: 16} ] sorted(students, key=lambda x: x[‘age’]) => [{‘name’: ‘Jimmy’, ‘age’: 15}, {‘name’: ‘Paige’, ‘age’: 16}, {‘name’: ‘Hector’, ‘age’: 18}]

min()

min方法在Python列表中搜索最小值。此方法接受一個必需引數和三個可選引數。必需的引數是可迭代的本身。(可選)您可以向此函式新增更多物件作為正在進行的引數。您也可以使用鍵進行排序(類似於排序方法)並指定預設值。請參閱以下示例:

傳入多個引數取最小值

min(0, -2, 1, 8, 5) => -2

傳入可迭代元素,取元素最小值

arr = [1, 2, 3, 4, 5] min(arr) => 1

傳入可迭代物件為空時,必須指定引數default,用來返回預設值

min([], default=0) => 0

傳入命名引數key,其為一個函式,用來指定取最小值的方法

(靈活運用,根據字典的鍵值)

students = [    {‘name’: ‘Jimmy’, ‘age’: 15},    {‘name’: ‘Hector’, ‘age’: 18},    {‘name’: ‘Paige’, ‘age’: 16} ] min(students, key=lambda x: x[‘age’]) => {‘name’: ‘Jimmy’, ‘age’: 15}

max()

max方法與min函式相同;但是,它找到一個可迭代的最大值。請參閱以下示例:

arr = [1, 2, 3, 4, 5] max(arr) => 5 max(0, -2, 1, 8, 5) => 8 students = [    {‘name’: ‘Jimmy’, ‘age’: 15},    {‘name’: ‘Hector’, ‘age’: 18},    {‘name’: ‘Paige’, ‘age’: 16} ] max(students, key=lambda x: x[‘age’]) => {‘name’: ‘Hector’, ‘age’: 18} max([], default=100) => 100

結論

高階函式很好用,如果您知道它們,可以節省很多時間。我希望您發現這些方法有用且易於使用。編碼愉快,如果覺得有用請關注本頭條號“

輕程式設計

”,每天一篇,輕輕鬆鬆學程式設計!覺得不錯,記得轉發點贊喲!

(此處已新增圈子卡片,請到今日頭條客戶端檢視)