亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

理解地圖功能

理解地圖功能

開滿天機 2019-07-09 16:48:12
理解地圖功能map(function, iterable, ...)將函數應用于可迭代的每一項,并返回結果列表。如果傳遞了額外的可迭代參數,函數必須接受這些參數,并行地應用于所有可迭代項。如果一個可迭代項比另一個可迭代項短,則假定擴展時不包含任何項。如果函數是None,則假定為標識函數;如果存在多個參數,map()返回一個由元組成的列表,其中包含來自所有可迭代項的對應項(一種轉置操作)。可迭代參數可以是序列或任何可迭代的對象;結果總是一個列表。這在制造笛卡爾產品中扮演什么角色?content = map(tuple, array)在任何地方放置一個元組有什么效果?我還注意到,如果沒有map函數,輸出是abc有了它,它a, b, c.我想充分理解這個功能。參考定義也很難理解。太多花哨的絨毛了。
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

map不是特別的琵琶。我建議使用列表理解來代替:

map(f, iterable)

基本上相當于:

[f(x) for x in iterable]

map它本身不能做笛卡兒積,因為它的輸出列表的長度總是與它的輸入列表相同。不過,您可以通過理解列表來做笛卡兒產品:

[(a, b) for a in iterable_a for b in iterable_b]

語法有點混亂-基本上相當于:

result = []for a in iterable_a:
    for b in iterable_b:
        result.append((a, b))


查看完整回答
反對 回復 2019-07-09
?
慕少森

TA貢獻2019條經驗 獲得超9個贊

map與笛卡兒積一點關系都沒有,盡管我想一個精通函數式編程的人可能會想出一些不可能理解的方法來生成一個用map.

map在Python 3中,這相當于:

def map(func, iterable):
    for i in iterable:
        yield func(i)

Python 2的唯一不同之處在于它將構建一個完整的結果列表,以便立即返回所有結果,而不是yield英。

雖然Python慣例通常傾向于列表理解(或生成器表達式)來實現與調用map,尤其是當您使用lambda表達式作為第一個參數時:

[func(i) for i in iterable]

作為您在問題注釋中要求的一個例子-“將字符串轉換為數組”,通過“數組”,您可能需要元組或列表(它們的行為都有點像來自其他語言的數組)-

 >>> a = "hello, world"
 >>> list(a)['h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']>>> tuple(a)('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd')

使用.map如果您以列單而不是單一的字符串-map可以單獨地對所有這些人進行語言化:

>>> a = ["foo", "bar", "baz"]>>> list(map(list, a))[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

請注意map(list, a)在Python 2中等效,但在Python 3中需要list如果您想做任何其他事情,而不是將它提供給for循環(或處理函數,如sum它只需要一個可迭代的,而不需要一個序列)。但也要再次注意,通常傾向于使用列表理解:

>>> [list(b) for b in a][['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]


查看完整回答
反對 回復 2019-07-09
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

map通過將函數應用于源的每個元素創建一個新列表:


xs = [1, 2, 3]


# all of those are equivalent — the output is [2, 4, 6]

# 1. map

ys = map(lambda x: x * 2, xs)

# 2. list comprehension

ys = [x * 2 for x in xs]

# 3. explicit loop

ys = []

for x in xs:

    ys.append(x * 2)

正元map等效于將可迭代的輸入壓縮到一起,然后對中間壓縮列表的每個元素應用轉換函數。它是不笛卡爾產品:


xs = [1, 2, 3]

ys = [2, 4, 6]


def f(x, y):

    return (x * 2, y // 2)


# output: [(2, 1), (4, 2), (6, 3)]

# 1. map

zs = map(f, xs, ys)

# 2. list comp

zs = [f(x, y) for x, y in zip(xs, ys)]

# 3. explicit loop

zs = []

for x, y in zip(xs, ys):

    zs.append(f(x, y))

我用過zip在這里,但是map實際上,當可迭代性大小不同時,行為實際上略有不同-正如其文檔中所指出的,它擴展了可訪問性以包含None.


查看完整回答
反對 回復 2019-07-09
  • 3 回答
  • 0 關注
  • 329 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號