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
結論
高階函式很好用,如果您知道它們,可以節省很多時間。我希望您發現這些方法有用且易於使用。編碼愉快,如果覺得有用請關注本頭條號“
輕程式設計
”,每天一篇,輕輕鬆鬆學程式設計!覺得不錯,記得轉發點贊喲!
(此處已新增圈子卡片,請到今日頭條客戶端檢視)