2013-10-25 1 views
7

Как работает reduce в python3 с тремя параметрами вместо двух. Таким образом, для двух,Уменьшить функцию с тремя параметрами

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

Я получаю это. Это просто суммирует все элементы в tup. Тем не менее, если вы даете уменьшить функцию трех параметров, как это ниже,

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

это даст вам значение 12. Я проверил документацию на python3, и он говорит, что третий аргумент является инициализатором. Тем не менее, что такое инициализатор по умолчанию, если третий аргумент не вставлен?

ответ

7

Если вы опускаете третий параметр, то в качестве инициализатора используется значение от tup.

Или, по-другому, reduce() помещает необязательный третий параметр перед значениями второго аргумента, если он присутствует.

Кроме того, это означает, что если второй аргумент является пустой последовательности, что третий аргумент служит в качестве значения по умолчанию, так же, как второй аргумент только с один элемента (и без явного инициализатора аргумента), был бы возвращаемое значение по умолчанию.

functools.reduce() documentation включает в себя версию 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, когда он не None, используется в качестве первого значения вместо первого значения от iterable.

+0

Хорошо, я, кажется, понимаю! Что делает 'next' в этой функции? – chanpkr

+1

@ChanPark: см. Документацию по ['next()') (http://docs.python.org/3/library/functions.html#next); получить следующее значение из итератора. Если 'iterable' является кортежем, это первый индекс. –

+1

Обратите внимание, что функция фактического уменьшения принимает 'None' как 3-й аргумент. – georg

0

уменьшить необязательный третий аргумент:

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

 Смежные вопросы

  • Нет связанных вопросов^_^