將函數作為一個參數傳入,這樣的函數稱為高階函數。
舉例一個最簡單的高階函數
def function(x, y, f):
return f(x) + f(y)
print(function(5, 6, abs)) # 即執行abs(5)+abs(6)
內置函數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 與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用於需要排序的情況下、且並不會改變原本的列表序列。而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函數需要導入 ==》 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