>>> reduce(lambda x, y: x*int(y), ['2', '3', '4'])
'222222222222'
Хорошо, вот что происходит:
На первом шаге уменьшения выполняется следующий расчет: '2' * 3
. Поскольку первый операнд является строкой, он просто повторяется 3
раз. Таким образом, вы в конечном итоге с '222'
.
На втором шаге уменьшения это значение умножается на 4: '222' * 4
. Снова, строка повторяется четыре раза, что приводит к '222222222222'
, который является именно тем результатом, который вы получили.
Этого можно избежать, либо преобразовав x
в целое число (вызывая int(x)
), либо сопоставив элементы списка с помощью целочисленного преобразования в первую очередь (на самом деле я думаю, что это более элегантно):
>>> reduce(lambda x, y: x * y, map(int, ['2', '3', '4']))
24