程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python -- 高階函數

編輯:Python

文章目錄

  • python 高階函數介紹
  • 常用高階函數 -- map
  • 常用高階函數 -- filter
  • 常用高階函數 -- sorted
  • 常用高階函數 -- reduce

python 高階函數介紹

將函數作為一個參數傳入,這樣的函數稱為高階函數。
舉例一個最簡單的高階函數

def function(x, y, f):
return f(x) + f(y)
print(function(5, 6, abs)) # 即執行abs(5)+abs(6)

常用高階函數 – map

內置函數map,map()函數接收的參數,一個是函數,一個是可迭代對象。
給map傳入一個函數作為參數,就要在後面傳一個可迭代對象。

map使用示例:單個函數參數

# 求列表內每個元素的平方值
lst = [1, 2, 3, 4, 5]
def func(x):
return x * x
result = map(func, lst)
print(list(result))
# 注意: map返回的類型是map類型,需將結果轉化為列表類型才能直觀看到結果

如果傳入的函數非常簡單的話,我們可以使用匿名函數,使代碼更加簡潔

lst = [1, 2, 3, 4, 5]
result = map(lambda x: x ** 2, lst)
print(list(result))

map使用示例:多個函數參數

# 將兩個列表中的值相加
lst1 = [1, 2, 3, 4, 5]
lst2 = [3, 6, 7]
def func(x, y):
return x + y
result1 = map(func, lst1, lst2)
print(list(result1))
# 匿名函數實現
result2 = map(lambda x, y: x + y, lst1, lst2)
print(list(result2))
# ------結果-----
D:\softs\python\python.exe E:/project/python基礎/迭代器與生成器/函數式編程/code_高階函數.py
[4, 8, 10]
[4, 8, 10]
# 這裡lst2列表數據取完之後,將不再進行運算,因此結果列表裡只有3個

以上就是map函數的使用示例,接下來用幾個實例練習練習
練習1:將列表[1,2,3,4,5] 所有元素轉換成str類型

lst = [1, 2, 3, 4, 5]
print(list(map(str, lst)))
# -------結果-----
D:\softs\python\python.exe E:/project/python基礎/迭代器與生成器/函數式編程/code_高階函數.py
['1', '2', '3', '4', '5']

練習2:將列表字符串‘span’ 各字符轉換成對應的ascii碼的列表

str = 'span'
print(list(map(ord, str)))
# ----結果------
D:\softs\python\python.exe E:/project/python基礎/迭代器與生成器/函數式編程/code_高階函數.py
[115, 112, 97, 110]

練習3:將列表a=[0.346574, 0.34534, 0.34523, 0.234534]轉換為百分比輸出,保留兩位小數

a = [0.346574, 0.34534, 0.34523, 0.234534]
print(list(map(lambda x: f'{
x*100:.2f}%', a)))
# -----結果-----
D:\softs\python\python.exe E:/project/python基礎/迭代器與生成器/函數式編程/code_高階函數.py
['34.66%', '34.53%', '34.52%', '23.45%']

常用高階函數 – filter

filter 與map相比還具備過濾的特點,在使用時,對每個傳入的數據,過濾函數值為真則保留,為假則去除。

示例:取出10以內的奇數、即x %2 ==1 則保留,x %2 ==0則去除

result = filter(lambda x: x % 2, range(10))
print(list(result))
# -----結果------
D:\softs\python\python.exe E:/project/python基礎/迭代器與生成器/函數式編程/code_高階函數.py
[1, 3, 5, 7, 9]

接下來也通過幾個練習來熟悉一下filter的使用
練習1:取出1 - 200 以內 開平方 是整數的數
結果:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196]

import math
result = filter(lambda x: math.sqrt(x).is_integer(), range(200))
print(list(result))

練習2:過濾出100-999以內的水仙花數 153 = 1^3 + 5^3 + 3^3
結果:[153, 370, 371, 407]

# 百位:a//100, 十位:a//10%10, 個位:a%10
def shuixian(a):
return a == ((a // 100)**3 + (a//10 % 10)**3 + (a % 10)**3)
result = filter(shuixian, range(100, 1000))
print(list(result))

練習3:去除一個序列中的空字符串
結果:[‘A’, ‘B’, ‘C’, ‘a’, 1]

lst = ['A', 'B', '', None, 'C', ' ', 'a', 1, 0]
result = filter(lambda x: x and str(x).strip(), lst)
print(list(result))

常用高階函數 – sorted

sorted用於需要排序的情況下、且並不會改變原本的列表序列。而python內建的函數sort()會直接改變原來列表的順序。
sorted()接收一個key函數來實現自定義的排序、key指定的函數將作用於list的每一個元素上,並根據key函數返回的結果進行排序。

使用示例:

# 1、直接使用排序
lst = [-6, 3, 2, -9, 7]
lst2 = sorted(lst)
print(lst)
print(lst2)
# 2、給定條件排序
print(sorted(lst, key=abs)) # 依據絕對值進行排序
# 3、進行不同類型之間的排序 (但是不支持數值和字符之間排序)
lst2 = [True, len(lst) > 2, 0, 2]
print(sorted(lst2))
# 結果:[0, True, True, 2]
# 4、列表裡面包含元組的排序
# 先比較每個元組的第一個值,一樣即再比較第二個,依次類推
lst = [(True, True, False),
(2, 1, 3),
(2, 2, 4),
(False, True, 2),
(False, False, 3)]
print(sorted(lst))
# 結果:[(False, False, 3), (False, True, 2), (True, True, False), (2, 1, 3), (2, 2, 4)]

下面演示幾個練習來熟悉一下sorted的使用

練習1:將序列中的字符串忽略大小寫進行排序

lst = ['sTt', 'CUt', 'add', 'tmp', 'By']
print(sorted(lst, key=lambda x: x.lower()))
# 結果: ['add', 'By', 'CUt', 'sTt', 'tmp']

練習2:按照字典的value值進行排序

d1 = {
'a': 3, 'b': 2, 'c': 4, 'd': 1}
print(dict(sorted(d1.items(), key=lambda x: x[1])))
#結果:{'d': 1, 'b': 2, 'a': 3, 'c': 4}

練習3:過濾文件中含python並且重復次數最多的前3行

with open("file.txt", 'r') as fp:
count = {
}
for line in fp:
if 'python' in line:
count[line] = count.get(line, 0) + 1
result = sorted(count.items(), key=lambda x: x[1], reverse=True)
print(result[:3])

常用高階函數 – reduce

reduce常用於做累計,前一次得到的結果繼續作為參數傳入
注意:reduce函數需要導入 ==》 from functools import reduce
使用示例:

from functools import reduce
# 將列表內的數字轉換為一個整數1234
a = [1, 2, 3, 4]
def func1(x, y):
return x * 10 + y
print(reduce(func1, a))
# 實現過程 ==> 1*10+2=12, 12*10+3=123, 123*10+4=1234

練習:使用reduce取出列表裡的數字,並按照順序轉換為整型

lst = ['a', '1', '2bb', '234', '', '9']
lst2 = filter(lambda x: x.isdigit(), lst) # 過濾出數字
print(int(reduce(lambda x, y: x + y, lst2)))
# 結果:12349

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved