4

sum(iterable)効果的に:

def sum(iterable):
    s = 0
    for x in iterable:
        s = s.__add__(x)
    return s

Pythonには、初期値を設定せずにこれを実現する組み込み関数がありますか?

# add is interchangeable with sub, mul, etc.
def chain_add(iterable):
    iterator = iter(iterable)
    s = next(iterator)
    while True:
        try:
            s = s.__add__(next(iterator))
        except StopIteration:
            return s

私が抱えている問題は、演算子sumをサポートする他のタイプでは機能しないことです。+Counter

4

3 に答える 3

8

reduce()Python関数を調べてみてください。関数、反復可能オブジェクト、およびオプションの初期化子を渡すと、関数がすべての値に累積的に適用されます。

例えば:

import functools
def f(x,y):
    return x+y

print functools.reduce(f, [1, 2, 3, 4]) # prints 10
print functools.reduce(f, [1, 2, 3, 4], 10) # prints 20, because it initializes at 10, not 0.

iterableに基づいて関数を変更できるため、非常にカスタマイズ可能です。

于 2012-08-14T22:56:49.083 に答える
2

追加の場合:

import operator
reduce(operator.add, iterable)

これは、を使用して一緒に追加できない反復可能オブジェクトで機能しsumます。同様に、を使用して乗算を実行できます

reduce(operator.mul, iterable)
于 2012-08-14T22:56:50.567 に答える
2

reduce()これは、Python3で移行されたのかなり良い使用法ですfunctools.reduce()

連鎖乗算の例を次に示します。

import functools
import operator

def chain_mul(iterable):
    return functools.reduce(operator.mul, iterable)

そこで、オペレーターoperator.mulモジュールの他の関数の1つに置き換えるか、引数を操作する独自の2つの引数関数を定義することができます。

于 2012-08-14T22:59:35.497 に答える