Python 函式進階-高階函式

小小垂髫發表於2022-04-25

高階函式

什麼是高階函式

高階函式就是能夠把函式當成引數傳遞的函式就是高階函式,換句話說如果一個函式的引數是函式,那麼這個函式就是一個高階函式。

高階函式可以是你使用def關鍵字自定義的函式,也有Python系統自帶的內建高階函式。

自定義一個高階函式

我們下面的例子中,函式 senior 的引數中有一個是函式,那麼senior就是一個高階函式;函式 tenfold 的引數不是函式,所以tenfold就只是一個普通的函式。

# 定義高階函式
def senior(func, container):
   """
   將容器中的資料依次放入函式中進行運算,
   將結果返回到迭代器中,最後返回迭代器。
   """
   lst = list()
   for i in container:
      lst.append(func(i))
   return iter(lst)


# 定義普通的功能函式
def tenfold(num):
   """
   十倍器
   將資料乘 10,返回結果。
   """
   return num * 10


# 定義一個列表
lst = [10, 20666, 'msr']

# 使用高階函式
it = senior(tenfold, lst)
print(list(it)) # [100, 206660, 'msrmsrmsrmsrmsrmsrmsrmsrmsrmsr']

常用的內建高階函式

函式 功能作用
map 處理可迭代物件中的資料,將處理的結果返回到迭代器中。
filter 過濾可迭代物件中的資料,將過濾好的資料返回到迭代器中。
reduce 處理可迭代物件中的資料,將最終的結果返回出來。
sorted 排序可迭代物件中的資料,將排序好的結果返回出來。

map函式

語法:map(function, Iterable)

引數說明

function:函式,可以是 自定義函式 或者是 內建函式;

iterable:可迭代物件,可迭代性資料。(容器型別資料和類容器型別資料、range物件、迭代器)

功能

把可迭代物件中的資料一個一個拿出來,然後放在到指定的函式中做處理,將處理之後的結果依次放入迭代器中,最後返回這個迭代器。

例項

將列表中的元素轉成整型型別,然後返回出來。

lst = ['1', '2', '3', '4']

""" 使用常規的寫法 """
new_lst = list()
for i in lst:
    new_lst.append(int(i))
print(new_lst)  # [1, 2, 3, 4]


""" 使用map函式實現 """
it = map(int, lst)
new_lst = list(it)
print(new_lst)  # [1, 2, 3, 4]

列表中的每一個數依次乘 2的下標索引+1 次方。使用自定義的函式,配合實現功能。

lst = [1, 2, 3, 4]

""" 普通的方法,利用左移 """
new_lst = list()
for i in lst:
	res = i << i
	new_lst.append(res)
print(new_lst)  # [2, 8, 24, 64]


""" 使用map函式 """
# 先定義一個左移函式,自定義的函式必須是一個帶參函式並且有返回值
def func(num):
	return num << num
new_lst = list(map(func, lst))
print(new_lst)  # [2, 8, 24, 64]


""" 使用lambda簡化 """
new_lst = list(map(lambda num: num << num, lst))
print(new_lst)  # [2, 8, 24, 64]

filter函式

語法:filter(function, iterable)

引數的意義和map函式一樣

功能

filter用於過濾資料,將可迭代物件中的資料一個一個的放入函式中進行處理,如果函式返回值為真,將資料保留;反之不保留,最好返回迭代器。

例項

保留容器中的偶數

lst = [11, 2, 3, 34, 4, 4, 55]

""" 常規寫法 """
new_lst = list()
for i in lst:
   if i % 2 == 0:
      new_lst.append(i)
print(new_lst)  # [2, 34, 4, 4]


""" 使用filter函式 """
def func(num):
   if num % 2 == 0:
      return True
new_lst = list(filter(func, lst))
print(new_lst)  # [2, 34, 4, 4]


""" filter + lambda """
new_lst = list(filter(lambda num: True if (num % 2 == 0) else False, lst))
print(new_lst)  # [2, 34, 4, 4]

reduce函式

語法:reduce(function, iterable)

引數含義與map、filter一致。

功能

計算資料,將可迭代物件的中的前兩個值放在函式中做出運算,得出結果在和第三個值放在函式中運算得出結果,以此類推,直到所有的結果運算完畢,返回最終的結果。

根據功能我們就應該直到,reduce中的函式需要可以接收兩個引數才可以。

例項

reduce函式使用需要先從標準庫functools中匯入

將列表中的資料元素組合成為一個數,

from functools import reduce

lst = [2, 0, 6, 6, 6]


""" 常規方法 """
char = str()
for i in lst:
   char += str(i)
print(int(char))    # 20666


""" 使用reduse函式 """
def func(x, y):
   return x * 10 + y
res = reduce(func, lst)
print(res)  # 20666


""" reduce + lambda """
res = reduce((lambda x, y: (x * 10 + y)), lst)
print(res)  # 20666

sorted函式

語法:sorted(Iterable, key=function, reverse=False)

引數說明

iterable:可迭代物件;

key:指定函式,預設為空;

reverse:排序的方法,預設為False,意為升序;

功能

如果沒有指定函式,就單純的將資料安札ASCII進行排序;如果指定了函式,就將資料放入函式中進行運算,根據資料的結果進行排序,返回新的資料,不會改變原有的資料。

注意,如果指定了函式,排序之後是根據資料的結果對原資料進行排序,而不是排序計算之後的就結果資料。

例項

將列表中的資料進行排序。

lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]

""" 使用列表的內建函式進行排序,預設升序 """
lst.sort()
print(lst)  # [-3, 1, 5, 6, 12, 12, 23, 34, 342, 2345]
# 降序排序
lst.sort(reverse=True)
print(lst)  # [2345, 342, 34, 23, 12, 12, 6, 5, 1, -3]


lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]
""" 使用sorted進行排序 """
new_lst = sorted(lst)
print(new_lst)  # [-3, 1, 5, 6, 12, 12, 23, 34, 342, 2345]
print(lst)      # [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]

還有一點就是 sorted 函式可以將資料放入函式中進行處理,然後根據結果進行排序。

lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]

""" 按照絕對值進行排序 """
new_lst = sorted(lst, key=abs)
print(new_lst)  # [1, -3, 5, 6, 12, 12, 23, 34, 342, 2345]


""" 按照除以10的餘數進行排序 """
def func(num):
   return num % 10
new_lst = sorted(lst, key=func)
print(new_lst)  # [1, 342, 12, 12, 23, 34, 5, 2345, 6, -3]

# 可以看到,我們指定函式之後排序的結果既不是原資料的絕對值、也不是原資料除以10的餘數,而是根據這兩種計算結果對原資料進行了排序。

sort和sorted

既然有了列表的內建函式sort,為什麼我們還要使用sorted函式呢?

  1. sorted可以排序一切可迭代物件,但是sort只是列表的內建函式,只能對列表進行排序;
  2. sorted排序返回新的資料,不改變原資料,sort改變了原資料;
  3. sorted可以指定函式,根據函式的計算結果、按照某一種方式進行排序,但是sort只能單純的根據數字大小和ASCII進行排序。

總結

高階函式就是將函式作為引數的函式。

map(Function,Iterable)(將可迭代性資料中的元素一一取出放入函式中進行運算在將結果返回,最後返回的資料型別是迭代器)

filter(Function,Iterable)(過濾資料,將可迭代性資料放入函式中進行運算,結果為真將資料返回,反之捨棄,最會返回的資料型別是迭代器)

reduce(Function,Iterable)(計算資料,將可迭代型資料中的前兩個元素拿出放入函式中進行運算將結果在與後一個元素進行運算,最後返回最終的結果)

sorted(Iterable,[key=Function],[reverse =Bool(False(default)/True)])(將可迭代型資料進行排序,或將可迭代型資料放入函式中進行運算將結果進行排序返回)

相關文章