簡體   English   中英

函數列表和參數的映射:解包難度

[英]map of function list and arguments: unpacking difficulty

我在mooc中有一個賦值,我必須編寫一個函數來返回輸入列表的累積和,累積乘積,最大值和最小值。
本課程的這一部分是關於函數式編程的,所以我想全力以赴,即使我可以使用其他方法。
所以我嘗試了這個:

from operator import mul
from itertools import repeat
from functools import reduce
def reduce2(l):
    print(l)
    return reduce(*l)
def numbers(l):
    return tuple(map(reduce2, zip([sum, mul,min, max], repeat(l,4))))
l=[1,2,3,4,5]
numbers(l)

我的問題是它不起作用。 如果我在map中使用它,zip將只傳遞一個對象減少,並且解壓縮zip將產生4個元組(函數和參數列表l)所以我定義了reduce2因為這個原因,我想解壓縮其中的zip但是它不工作。
Python返回一個TypeError:int'對象不可迭代
我認為我可以在reduce2中使用return reduce(l [0],l [1]),但仍然存在相同的錯誤。
我不明白python的行為。 如果我只使用return reduce(l),它會再次返回一個TypeError:減少預期的至少2個參數,得到1

這里發生了什么事? 我怎么能讓它工作? 謝謝你的幫助。

實際上,您正在嘗試執行以下代碼:

xs = [1, 2, 3, 4, 5]
reduce(sum, xs)

但是sum需要一個可迭代的,並且與通過reduce直接使用並不真正兼容。 相反,你需要一個帶有2個參數並返回它們的和的函數 - 一個類似於mul的函數。 你可以從operator那里得到:

from operator import mul, add

然后只需更改sum即可add到您的程序中。

BTW,函數式編程有一個非常酷的變量命名約定: x表示一件事, xs表示它們的列表。 它比難以閱讀的l變量名要好得多。 它還使用單數/復數來告訴您是處理標量值還是集合。

FMc答案正確診斷代碼中的錯誤。 我只想為你的map + zip方法添加幾個替代方案。

首先,不是定義特殊版本的reduce ,而是使用itertools.starmap而不是map ,它專門用於此目的:

def numbers(xs): 
    return tuple(starmap(reduce, zip([add, mul, min, max], repeat(xs))))

但是,更好的方法是使用經常忽略的可變參數版本map而不是手動壓縮參數:

def numbers(xs):
    return tuple(map(reduce, [add, mul, min, max], repeat(xs)))

它基本上為你做了zip + starmap 在函數式編程方面,這個版本的map類似於Haskell的zipWith函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM