#1.高階函數
#把函數作爲參數傳入,這樣的函數就叫做高階函數。
# 高階函數是函數式編程的體現,函數式編程就是指這種高度抽象的編程範式
# 作用 : 化簡代碼,增加代碼靈活性
def sum_num(a, b, f):
return f(a) + f(b)
#第三個參數傳入abs()函數
print(sum_num(-1, 5, abs)) #輸出 6
#第三個參數傳入round()函數
print(sum_num(1.1, 2.9, round)) #輸出 4
# 2. 內置高階函數
# 2.1 map()
# map(function, iterable),將傳入的函數變量func作用到lst變量的每個元素中
# 並將結果組成新的列表(python2)/迭代器(python3)返回
# function -- 函數
# iterable -- 一個或多個序列
def square(x):
return x ** 2
list2 = map(square, [1, 2, 3, 4])
print(list2) #返回迭代器,輸出 <map object at 0x0000013BE63933D0>
print(list(list2)) #輸出 [1, 4, 9, 16]
list3 = map(lambda x : x ** 2, [1, 2, 3, 4])
print(list3) #輸出 <map object at 0x0000013BE63B8F70>
print(list(list3)) #輸出 [1, 4, 9, 16]
#提供兩個列表,對相同位置的列表數據進行相加
list4 = map(lambda x, y : x + y, [1, 2, 3, 4], [5, 6, 7, 8])
print(list4) #輸出 <map object at 0x0000013BE64334F0>
print(list(list4)) #輸出 [6, 8, 10, 12]
#2.2 reduce()函數
#reduce(func, lst), 其中func函數必須要有兩個參數
#每次 func 計算的結果繼續和序列的下一個元素做累積計算
import functools
l1 = functools.reduce(lambda x, y : x + y, [1, 2, 3, 4, 5, 6, 7, 8])
print(l1) #輸出 36
#2.3 filter()函數
#filter(func, lst)函數用於過濾序列,過濾掉不符合條件的元素
# 返回一個filter對象,如果要轉換爲列表,可以用list()轉換
# 將序列中的奇數過濾出來
l2 = filter(lambda x : x % 2 == 1, range(1, 10))
print(l2) #輸出 <filter object at 0x000001FD698146A0>
print(list(l2)) #輸出 [1, 3, 5, 7, 9]
# 將序列中平方根是整數的數過濾出來
import math
l3 = filter(lambda x : math.sqrt(x) % 1 == 0, range(1, 101))
print(l3) #輸出 <filter object at 0x000001FD698146D0>
print(list(l3)) #輸出 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]