Так что теперь уменьшить(). Это на самом деле тот, которого я всегда ненавидел больше всего, потому что, помимо нескольких примеров с участием + или *, почти каждый раз, когда я вижу вызов reduce() с нетривиальным аргументом функции, мне нужно захватить ручку и бумагу диаграмму, что на самом деле подается в эту функцию, прежде чем я пойму, что должен делать метод reduce(). Поэтому, на мой взгляд, применимость reduce() в значительной степени ограничена ассоциативными операторами, и во всех остальных случаях лучше написать цикл накопления явно.
Быстрый, что это следующий код делает?
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]
Но было бы лучше всего, если бы я просто использовал для цикла:
total = 0
for a, b in items:
total += b
Или сумма() встроенными in и выражение генератора:
total = sum(b for a,b in items)
Многие виды использования reduce() более ясны при написании как для циклов.
Gah, это ужасная аргументация :( – TraumaPony 2008-10-08 07:22:33
Является ли это? Много философии Python - это четкий и понятный код. Типичный вызов для сокращения() обычно требует, чтобы я вырвал карандаш и нарисуйте, что функция с. – 2008-10-08 07:57:22