巧用Python高階函數,秒提代碼逼格

Python以簡單易學,語法簡潔易懂,編碼優美規範的特色,受到不少程序員和普通人的喜好,相信和我同樣,有不少人在學過Python以後就對其愛不釋手了吧,今天給你們分享幾個經常使用的高階函數,瞬間提高代碼逼格,成爲一個有深度、有內涵的Python程序員!python

all( )

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方法返回知足條件的列表中全部元素的新列表。此方法接受一個函數一個可迭代的參數。可是,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()

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

inpython中很重要的一個關鍵字,並非一個方法,主要用來檢查數組中是否存在元素。

舉個例子:

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函數須要Pythonfunctools,所以請不要忘記導入該庫。看到這段文字我相信你確定會懵逼,不過不要緊,咱們仍是來舉個例子,來幫助你們來理解!

舉個例子:

仍是以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 能夠對全部可迭代的對象進行排序操做。

listsort 方法返回的是對已經存在的列表進行操做,無返回值,而內建函數 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列表中搜索最小值。此方法接受一個必需參數和三個可選參數。必需的參數是可迭代的自己。(可選)您能夠向此函數添加更多對象做爲正在進行的參數。您也可使用鍵進行排序(相似於排序方法)並指定默認值。請參閱如下示例:

  1. 傳入多個參數取最小值
min(0, -2, 1, 8, 5)
=> -2
複製代碼
  1. 傳入可迭代元素,取元素最小值
arr = [1, 2, 3, 4, 5]

min(arr)
=> 1
複製代碼
  1. 傳入可迭代對象爲空時,必須指定參數default,用來返回默認值
min([], default=0)
=> 0
複製代碼
  1. 傳入命名參數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
複製代碼

結論

高階函數很好用,若是您知道它們,能夠節省不少時間。我但願您發現這些方法有用且易於使用,編碼愉快,若是以爲有用請關注「輕編程」,天天一篇,輕輕鬆鬆學編程!以爲不錯,記得轉發點贊喲!

相關文章
相關標籤/搜索