摘要:作為高階函數,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的,還可以計算任意復雜的函數,比如,把這個所有數字轉為字符串只需要一行代碼。
Python 學習 函數式編程 高階函數 Higher-order function
變量可以指向函數
以Python內置的求絕對值的函數abs()為例
>>> f>>> f(-10) 10
函數名也是變量
>>> abs = 10 >>> abs(-10)
注:由于abs函數實際上是定義在import builtins模塊中的,所以要讓修改abs變量的指向在其它模塊也生效,要用import builtins; builtins.abs = 10。
傳入函數
def add(x, y, f): return f(x) + f(y) add(1,2,abs)map函數
map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次作用到序列的每個元素,并把結果作為新的Iterator返回。
比如有一個函數f(x)=x2,要把這個函數作用在一個list [1, 2, 3, 4, 5, 6, 7, 8, 9]上
def f(x): return x * x r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81]
map()傳入的第一個參數是f,即函數對象本身。由于結果r是一個Iterator,Iterator是惰性序列,因此通過list()函數讓它把整個序列都計算出來并返回一個list。
map()作為高階函數,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的f(x)=x2,還可以計算任意復雜的函數,比如,把這個list所有數字轉為字符串:
reduce函數list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]
只需要一行代碼。
把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方說對一個序列求和,就可以用reduce實現:
>>> from functools import reduce >>> def add(x, y): ... return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) 25
當然求和運算可以直接用Python內建函數sum(),沒必要動用reduce。
但是如果要把序列[1, 3, 5, 7, 9]變換成整數13579,reduce就可以派上用場:
>>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 3, 5, 7, 9]) 13579
如果考慮到字符串str也是一個序列,對上面的例子稍加改動,配合map(),我們就可以寫出把str轉換為int的函數:
>>> from functools import reduce >>> def fn(x, y): ... return x * 10 + y ... >>> def char2num(s): ... digits = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9} ... return digits[s] ... >>> reduce(fn, map(char2num, "13579")) 13579
整理成一個str2int的函數就是:
from functools import reduce DIGITS = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9} def str2int(s): def fn(x, y): return x * 10 + y def char2num(s): return DIGITS[s] return reduce(fn, map(char2num, s))
還可以用lambda函數進一步簡化成:
from functools import reduce DIGITS = {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9} def char2num(s): return DIGITS[s] def str2int(s): return reduce(lambda x, y: x * 10 + y, map(char2num, s))
假設Python沒有提供int()函數,你完全可以自己寫一個把字符串轉化為整數的函數,而且只需要幾行代碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41582.html
摘要:關于的三個謊言,你一定要清楚。這是的整個知識體系圖譜,對于新手來說,沒必要學那么多。第四自動化測試一切關于自動化的東西,似乎都可以滿足,可以滿足大多數自動化工作,提升工作效率。這都是正常的,千萬別急著否定自己,懷疑自己。 ...
摘要:勤學學習效率與效果取決于執行力。這一步學習的正確姿勢是在實踐操作中發掘問題,然后帶著問題找答案。拆分任務將目標分解成具體可執行的學習任務。勤學強大的執行力是學習的根本保障。分享復述檢驗學習成果,提高學習效果的最好方法。 showImg(https://segmentfault.com/img/bVbcPGZ?w=256&h=256); 前段時間和大家一起分享了一篇關于學習方法內容《大牛...
摘要:它需要將近美元才能買到,但是你可以下載免費的和版本。在需要花費美元來開始你的學習,將會有超過頁的內容和個多小時的視頻供你訪問,還包括以后可以免費更新。 showImg(https://segmentfault.com/img/bVrJpw); 用Python編寫代碼一點都不難,事實上它一直被贊譽為最容易學的編程語言。如果你準備學習web開發, Python是一個不錯的開始,甚至想做游戲...
摘要:學習筆記七數學形態學關注的是圖像中的形狀,它提供了一些方法用于檢測形狀和改變形狀。學習筆記十一尺度不變特征變換,簡稱是圖像局部特征提取的現代方法基于區域圖像塊的分析。本文的目的是簡明扼要地說明的編碼機制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個提問: pyth...
閱讀 2344·2021-11-23 09:51
閱讀 1999·2021-10-14 09:43
閱讀 2760·2021-09-27 13:35
閱讀 1144·2021-09-22 15:54
閱讀 2495·2021-09-13 10:36
閱讀 3785·2019-08-30 15:56
閱讀 3404·2019-08-30 14:09
閱讀 1711·2019-08-30 12:57