Python以簡單易學,語法簡潔易懂,編碼優美規範的特色,受到不少程序員和普通人的喜好,相信和我同樣,有不少人在學過Python以後就對其愛不釋手了吧,今天給你們分享幾個經常使用的高階函數,瞬間提高代碼逼格,成爲一個有深度、有內涵的Python程序員!python
all()
方法用於判斷給定的可迭代參數iterable
中的全部元素是否都爲 True
,若是是返回True
,不然返回False
程序員
舉個例子:編程
已知有以下所示arr
這樣一個列表數據:數組
arr = [1, 2, 3, 4, 5]
複製代碼
>> 判斷arr列表中的數據是否都大於0markdown
all(i > 0 for i in arr)
=> True
複製代碼
明顯一眼就能夠看出1-5
這幾個數據明顯都是大於0
的,因此天然返回True
!函數
>> 判斷arr
列表中的數據是否都小於4ui
all( i < 4 for i in arr)
=> False
複製代碼
明顯的5
大於4
,有一個不符合條件,因此返回False
!編碼
filter方法返回知足條件的列表中全部元素的新列表。此方法接受一個函數和一個可迭代的參數。可是,filter方法返回一個過濾器對象而不是一個列表。所以,咱們必須將過濾器對象轉換爲列表。spa
舉個例子:code
仍是以開始的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方法返回知足條件的列表的第一個元素。這相似於其餘語言中的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
是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
方法返回一個新列表,其中全部元素均由函數轉換。此方法接受兩個參數:函數和可迭代。與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函數須要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
是應用在 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方法在Python列表中搜索最小值。此方法接受一個必需參數和三個可選參數。必需的參數是可迭代的自己。(可選)您能夠向此函數添加更多對象做爲正在進行的參數。您也可使用鍵進行排序(相似於排序方法)並指定默認值。請參閱如下示例:
min(0, -2, 1, 8, 5)
=> -2
複製代碼
arr = [1, 2, 3, 4, 5]
min(arr)
=> 1
複製代碼
min([], default=0)
=> 0
複製代碼
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方法與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
複製代碼
高階函數很好用,若是您知道它們,能夠節省不少時間。我但願您發現這些方法有用且易於使用,編碼愉快,若是以爲有用請關注「輕編程」,天天一篇,輕輕鬆鬆學編程!以爲不錯,記得轉發點贊喲!