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