我正在玩累積函式,我認為這accumulate(<int[]>,sum)會產生累積和。但是,運行以下代碼會導致錯誤。
from itertools import accumulate
print([*accumulate([1,2,3],sum)])
具體來說,我得到TypeError: 'int' object is not iterable. 另一方面,使用執行完全相同操作的 lambda 函式運行相同的代碼會導致預期的結果。
from itertools import accumulate
print([*accumulate([1,2,3],lambda *args:sum(args))])
# [1, 3, 6]
當我使用具有相同功能的命名自定義函式運行此代碼時,我得到了另一個奇怪的結果。
from itertools import accumulate
def my_sum(*args): return sum(args)
print([*accumulate([1,2,3]),my_sum])
#[1, 3, 6, <function my_sum at 0x7fd57139caf0>]
目前尚不清楚是什么導致了行為上的差異。sum,my_sum,并且匿名函式屬于“函式”型別,所以型別本身并不能決定事情。我還做了以下事情,看看我是否能得到任何其他線索;我注意到的唯一區別是它sum是一個內置函式。
print(lambda *args:sum(args),my_sum,sum,sep='\n')
# <function <lambda> at 0x7fd57139cb80>
# <function my_sum at 0x7fd57139cc10>
# <built-in function sum>
那么這里發生了什么?
uj5u.com熱心網友回復:
來自檔案:對于itertools.accumulate(iterable[, func, *, initial=None])
如果
func提供,它應該是兩個引數的函式。輸入的元素iterable可以是任何可以作為引數接受的型別func。(例如,使用默認的加法操作,元素可以是任何可加型別,包括Decimal或Fraction。)
sum()確實接受兩個引數,但第一個引數必須是可迭代的,第二個是起始值。檔案
讓我們通過列印引數來看看accumulate()傳遞給它的論點funcmy_sum()
def my_sum(*args):
print(args)
return sum(args)
accumulate([1, 2, 3], my_sum)
# (1, 2)
# (3, 3)
所以accumulate()將最后一個累加值和下一個數字傳遞給func. 由于 to 的第一個引數sum()必須是可迭代的(anint不是),因此您會收到該錯誤。
您的 lambda不等同于sum():sum()接受一個迭代并回傳其元素的總和。您的 lambda 接受任意數量的引數并回傳這些引數的總和。要對此進行測驗,請查看執行操作時會得到什么sum([1, 2, 3]),并且my_sum([1, 2, 3]).
在你的最后一個例子中,你有一個錯字。你沒有my_sum傳給accumulate(). 您創建了一個串列,其中包含 的結果accumulate([1, 2, 3]),然后是函式my_sum。將其修復為print([*accumulate([1,2,3], my_sum)]),您將獲得與 lambda 情況相同的輸出。
請注意,提供 nofunc的行為就像func=operator.add并且會給您一個累積總和。
>>> accumulate([1, 2, 3])
[1, 3, 6]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453149.html
標籤:Python python-3.x 迭代工具 积累
下一篇:與資料框中每一行的最小差異
