Это то, что беспокоило меня в течение некоторого времени. Я изучил Haskell до того, как начал изучать Python, поэтому мне всегда нравилось думать о многих вычислениях как о отображении в списке. Это прекрасно выражено в понимании списка (здесь я даю питонскую версию):
result = [ f(x) for x in list ]
Во многих случаях мы хотим выполнить более одного оператора для x, скажем:
result = [ f(g(h(x))) for x in list ]
Это очень быстро становится неуклюжим и трудным для чтения.
Мое обычное решение - развернуть это обратно в цикл for:
result = []
for x in list:
x0 = h(x)
x1 = g(x0)
x2 = f(x1)
result.append(x2)
Одна вещь, которая беспокоит меня бесконечно, - это инициализация пустого списка «результат». Это мелочь, но меня это расстраивает. Мне было интересно, есть ли альтернативные эквивалентные формы. Одним из способов может быть использование локальной функции (это то, что они называются в Python?)
def operation(x):
x0 = h(x)
x1 = g(x0)
x2 = f(x1)
return x2
result = [ operation(x) for x in list ]
Есть ли какие-либо конкретные преимущества / недостатки в любой из двух форм выше? Или, может быть, есть более элегантный способ?