[英]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.