Так что теперь уменьшаем (). Это на самом деле тот, который я всегда ненавидел больше всего, потому что, за исключением нескольких примеров, включающих + или *, почти каждый раз, когда я вижу вызову redu () с нетривиальным аргументом функции, мне нужно взять ручку и бумагу представьте диаграмму, что на самом деле подается в эту функцию, прежде чем я пойму, что должен делать redu (). Поэтому, на мой взгляд, применимость метода limit () в значительной степени ограничена ассоциативными операторами, и во всех других случаях лучше явно выписать цикл накопления.
Быстро, что делает следующий код?
total = reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
Вы можете понять это, но требуется время, чтобы распутать выражение, чтобы выяснить,
в чем дело. Использование коротких вложенных операторов def делает вещи немного лучше:
def combine (a, b):
return 0, a[1] + b[1]
total = reduce(combine, items)[1]
Но было бы лучше всего, если бы я просто использовал цикл for:
total = 0
for a, b in items:
total += b
Или встроенная сумма () и выражение генератора:
total = sum(b for a,b in items)
Многие случаи использования метода Reduce () более понятны при написании циклов.