🍋函數式編程中的函數指的並非編程語言中的函數(或方法) 🍋它指的是數學意義上的函數,即映射關係(如:y = f(x)),就是 y 和 x 的對應關係
🍋比起邏輯式, 函數式更加註重的是執行結果並不是執行的過程
🍋Python並非一門函數式的編程語言,但卻提供了不少函數式編程的特性 🍋好比 : lambda, max, min, map, reduce, filter
🍋有函數名,循環使用,保存了名字,經過名字就能夠重複引用函數 def foo(x,y): return x**y foo(2,3) # 8
🍋沒有函數名,一次性使用,隨時隨地定義 f = lambda x,y:x ** y print(f(2,4)) # 16 # 通常配合應用 : max, min, sorted, map, reduce, filter
res = (lambda x, y: x + y)(7,8) print(res) # 15
f = lambda x,y:x ** y print(f(2,4)) # 16 🍋匿名函數的本質就是沒有名字,這裏指定名字是沒有意義的(匿名函數只用於臨時調用一次) 🍋匿名函數通常用來與其餘函數配合使用,如下來展開介紹
([可迭代對象],[函數])
([可迭代對象],[函數])
接收三個參數 : ([可迭代對象],[函數],[排列順序])
python
若是傳入的可迭代對象是字典, 默認是按照字典的 "key" 來進行排序的編程
reverse參數 : "False"表明從小到大, "True"表明的是從大到小編程語言
🍋以每一個人的薪資來作比較 salaries = { 'song' : 1000, 'hai' : 10000, 'xing' : 100000, 'shawn' : 1000000, } 🍋"max"接收兩個參數([可迭代對象],[函數]),函數循環取的是"salaries[k]",而後進行比較,返回的是"key" print(max(salaries,key=lambda k:salaries[k])) # shawn 🍋"min"接收兩個參數([可迭代對象],[函數]),函數循環取的是"salaries[k]",而後進行比較,返回的是"key" print(min(salaries,key=lambda k:salaries[k])) # song 🍋"sorted"接收三個參數([可迭代對象],[函數],[排列順序]),函數循環取的是"salaries[k]",而後進行排序,默認排序從小到大 print(sorted(salaries,key=lambda k:salaries[k])) # ['song', 'hai', 'xing', 'shawn'] 🍋排序加上順序參數"reverse","False"表明從小到大,"True"表明的是從大到小 print(sorted(salaries,key=lambda k:salaries[k],reverse=True)) # ['shawn', 'xing', 'hai', 'song']
([函數],[可迭代對象])
🍋將"nums"裏面的只都進行平方計算 nums = [1,2,3,4,5,6,7] res = map(lambda x:x**2,nums) print(res.__next__()) # 這是迭代器對象的一個方法,每次 next 都取出一個值(說明了獲得的結果是一個迭代器) print(list(res)) # [1, 4, 9, 16, 25, 36, 49] 🍋生成器表達式來替代"map" nums = [1,2,3,4,5,6,7] res = (i ** 2 for i in nums) print(res) # 獲得的是一個生成器 <generator object <genexpr> at 0x0000015FD8EDAAC8> print(res.__next__()) # 1 print(res.__next__()) # 4 print(res.__next__()) # 9 print(res.__next__()) # 16 ... 🍋需求 : "song"加上"_hp"結尾,其餘的加上"_np"結尾 names = ["song","hai","xing","shawn"] res = map(lambda i:i+"_hp" if i == "song" else i + "_np", names) # 三元表達式 print(res) # 迭代器對象 <map object at 0x000001A1C34DFBC8> print(list(res)) # ['song_hp', 'hai_np', 'xing_np', 'shawn_np']
接收三個參數 : ([函數],[可迭代對象],[初始值])
函數式編程
**reduce **在python2中是內置函數, 在python3中被集成到模塊 functools 中, 須要導入使用函數
運行原理 : 以初始值做爲第一個參數傳給 x , 而後迭代傳入的可迭代對象, 拿到的值 y 與 x 相加劇新賦值給 x , 再次迭代取值, 周而復始, 直到迭代器被迭代完code
🍋需求 : 求和 from functools import reduce res1 = reduce(lambda x,y: x + y , range(1,10),0) # 從 0 開始,迭代相加(9)次 res2 = reduce(lambda x,y: x + y , range(1,10),1) # 從 1 開始,迭代相加(9)次 res3 = reduce(lambda x,y: x + y , range(1,100)) # 不寫初始值默認就是 0 print(res1) # 0+1+2+3+4+5+6+7+8+9=45 print(res2) # 1+1+2+3+4+5+6+7+8+9=46 print(res3) # 45 🍋列表求和 array = [1, 4, 9, 16, 25] res = reduce(lambda x, y: x + y, array) print(res) # 55
([函數],[可迭代對象])
🍋需求 : 返回以"_sb"結尾的元素 names = ['song', 'hai_sb', 'xing','shi_sb','nb_sb'] res = filter(lambda x:True if x.endswith('sb') else False,names) #三元表達式 res = filter(lambda x:x.endswith('sb'),names) print(res) # <filter object at 0x000001445164FC08> print(list(res)) # ['hai_sb', 'shi_sb', 'nb_sb'] 🍋過濾大於或等於 23 的數 l = [12,23,45,10,25,58,47,69] res = filter(lambda x:x >= 23,l) print(res) # <filter object at 0x00000227F5510708> print(list(res)) # [23, 45, 25, 58, 47, 69] 🍋過濾薪資大於 30000 的小夥 salaries = { 'song' : 1000, 'hai' : 10000, 'xing' : 100000, 'shawn' : 1000000, } res = filter(lambda k:salaries[k] >30000 ,salaries) print(res) # <filter object at 0x000001CFC1138F48> print(list(res) # ['xing', 'shawn']