web-dev-qa-db-ja.com

3つのパラメーターで関数を減らす

reduce関数は、2つではなく3つのパラメーターを使用してpython3でどのように機能しますか。だから、2人のために、

tup = (1,2,3)
reduce(lambda x, y: x+y, tup)

これを手に入れました。これは、tupのすべての要素を合計するだけです。ただし、以下のようにreduce関数に3つのパラメーターを指定すると、

tup = (1,2,3)
reduce(lambda x, y: x+y, tup, 6)

これにより、12の値が得られます。 python3のドキュメントを確認したところ、3番目の引数は初期化子であると書かれています。そうは言っても、3番目の引数が挿入されていない場合のデフォルトの初期化子は何ですか?

17
chanpkr

3番目のパラメーターを省略すると、tupの-​​first値が初期化子として使用されます。

または、別の言い方をすれば、reduce()は、オプションの3番目のパラメーターを2番目の引数の値の前に配置します(存在する場合)。

さらに、2番目の引数がemptyシーケンスの場合、その3番目の引数は、one要素のみ(および明示的な初期化子なし)を持つ2番目の引数と同様にデフォルトとして機能します。引数)、がデフォルトの戻り値になります。

functools.reduce()ドキュメント にはPythonバージョンの関数:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

initializerでない場合、Noneiterableの最初の値ではなく、最初の値としてどのように使用されるかに注意してください。

22
Martijn Pieters

3番目のパラメーターとしてタプルを提供すると、複数の値を減らすことから計算して返すことができます。

from functools import reduce
def mean(my_list):                  # == sum(my_list) / len(my_list)
    return (lambda x: x[0]/x[1]) (reduce(lambda x, y : (x[0]+y, x[1]+1), 
                                                my_list, (0, 0,)))
1
igor Smirnov

reduceオプションの3番目の引数:

>>> import functools
>>> test = []
>>> functools.reduce((lambda x,y: x+y), test, "testing")
0
Olivier Oli