国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python內(nèi)置函數(shù) map/reduce

Miracle_lihb / 1194人閱讀

摘要:函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是,將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的返回。舉例說(shuō)明,比如我們有一個(gè)函數(shù),要把這個(gè)函數(shù)作用在一個(gè)上,就可以用實(shí)現(xiàn)如下傳入的第一個(gè)參數(shù)是,即函數(shù)對(duì)象本身。

Python內(nèi)建了map()和reduce()函數(shù)。

如果你讀過(guò)Google的那篇大名鼎鼎的論文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。
我們先看map。map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回。
舉例說(shuō)明,比如我們有一個(gè)函數(shù)f(x)=x2,要把這個(gè)函數(shù)作用在一個(gè)list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()實(shí)現(xiàn)如下:

def f(x):
    return x*x

r = map(f,[1,2,3,4,5,6,7,8,9])
print(list(r))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()傳入的第一個(gè)參數(shù)是f,即函數(shù)對(duì)象本身。由于結(jié)果r是一個(gè)Iterator,Iterator是惰性序列,因此通過(guò)list()函數(shù)讓它把整個(gè)序列都計(jì)算出來(lái)并返回一個(gè)list。
你可能會(huì)想,不需要map()函數(shù),寫一個(gè)循環(huán),也可以計(jì)算出結(jié)果:

L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
    L.append(f(n))
print(L)

的確可以,但是,從上面的循環(huán)代碼,能一眼看明白“把f(x)作用在list的每一個(gè)元素并把結(jié)果生成一個(gè)新的list”嗎?
所以,map()作為高階函數(shù),事實(shí)上它把運(yùn)算規(guī)則抽象了,因此,我們不但可以計(jì)算簡(jiǎn)單的f(x)=x2,還可以計(jì)算任意復(fù)雜的函數(shù),比如,把這個(gè)list所有數(shù)字轉(zhuǎn)為字符串:

list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
["1", "2", "3", "4", "5", "6", "7", "8", "9"]

只需要一行代碼。


再看reduce的用法。reduce把一個(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)
比方說(shuō)對(duì)一個(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(),沒(méi)必要?jiǎng)佑胷educe。
但是如果要把序列[1, 3, 5, 7, 9]變換成整數(shù)13579,reduce就可以派上用場(chǎng):

from functools import reduce
def fn(x, y):
    return x * 10 + y
reduce(fn, [1, 3, 5, 7, 9])
13579

這個(gè)例子本身沒(méi)多大用處,但是,如果考慮到字符串str也是一個(gè)序列,對(duì)上面的例子稍加改動(dòng),配合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)一步簡(jiǎ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))

也就是說(shuō),假設(shè)Python沒(méi)有提供int()函數(shù),你完全可以自己寫一個(gè)把字符串轉(zhuǎn)化為整數(shù)的函數(shù),而且只需要幾行代碼!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43051.html

相關(guān)文章

  • Python的sum、map、filter和reduce

    摘要:最近在看英文版,看到了講解等函數(shù),覺(jué)得講解的思路特別好。所以,我加上了自己的理解,寫了本篇文章。 最近在看《Think Python》(英文版),看到了講解map, reduce, filter等函數(shù),覺(jué)得講解的思路特別好。所以,我加上了自己的理解,寫了本篇文章。 引子 如果要對(duì)列表中的數(shù)字求和,我們可以這樣做: def add_all(t): t is a list of n...

    fasss 評(píng)論0 收藏0
  • Python進(jìn)階筆記

    摘要:用匿名函數(shù)有個(gè)好處,因?yàn)楹瘮?shù)沒(méi)有名字,不必?fù)?dān)心函數(shù)名沖突。和不同的是,把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是還是決定保留還是丟棄該元素。字符串給出當(dāng)前平臺(tái)使用的行終止符。程序中間的退出,為正常退出。 列表生成式 函數(shù)的參數(shù)類型 lambda函數(shù) map, reduce, filter, sorted函數(shù) eval, exec, join, zip函數(shù) itertools中的...

    ygyooo 評(píng)論0 收藏0
  • python學(xué)習(xí)筆記-map/reduce/filter/sorted

    摘要:會(huì)依次將中的數(shù)據(jù)傳遞到中,根據(jù)返回的或者,留下或者拋棄這個(gè)值。而對(duì)于字符串,則是根據(jù)字符串對(duì)應(yīng)的碼表進(jìn)行排序。同時(shí)也是一個(gè)高階函數(shù),可以實(shí)現(xiàn)自定義的排序方式。 map/reduce是一種編程思想,在各個(gè)領(lǐng)域都有它的實(shí)踐。網(wǎng)上有一個(gè)簡(jiǎn)單的例子解釋map/reduce。比如說(shuō)你需要數(shù)一下某一個(gè)圖書館中有多少本藏書。最傻瓜的做法就是排一個(gè)人從頭數(shù)到尾。這樣速度慢,低效。另一種方法就是先將圖書...

    用戶83 評(píng)論0 收藏0
  • 小李飛刀:python請(qǐng)你輕輕輕點(diǎn)虐

    摘要:迭代器可以直接作用于循環(huán)的對(duì)象統(tǒng)稱為可迭代對(duì)象??梢员缓瘮?shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器。這個(gè)高階函數(shù),關(guān)鍵在于正確實(shí)現(xiàn)一個(gè)篩選函數(shù)。 又是日常嘮嗑的一小段 真的是非常話嘮的在下,日常給自己打點(diǎn)雞血吧。昨晚和老媽聊了一整晚,所以昨天并沒(méi)有更新。然后因?yàn)楹芸煲_(kāi)始算個(gè)稅減免的部分,對(duì)于溫飽線的在下而言,其實(shí)減免的可能就只是奶茶錢吧。工作的本質(zhì)是賺錢,我也很想在30歲之前完成財(cái)務(wù)自...

    Keagan 評(píng)論0 收藏0
  • [python] 初探'函數(shù)式編程'

    摘要:前言繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時(shí)是覺(jué)得沒(méi)啥用直接跳過(guò)了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 前言 繼續(xù)向下看廖大教程,看到了函數(shù)式編程這一節(jié),當(dāng)時(shí)是覺(jué)得沒(méi)啥用直接跳過(guò)了,這次準(zhǔn)備要仔細(xì)看一遍了,并記錄下一些心得。 函數(shù)式編程 上學(xué)期有上一門叫 人工智能 的課,老師強(qiáng)行要我們學(xué)了一個(gè)叫做 prolog 的語(yǔ)言,哇那感覺(jué)確實(shí)難受,思維方式完全和之前學(xué)過(guò)的不一樣,...

    xcc3641 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Miracle_lihb

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<