Понимание списка Python – хотите избежать повторной оценки ⇐ Python

Программы на Python
Anonymous
Понимание списка Python – хотите избежать повторной оценки

Сообщение Anonymous »

У меня есть понимание списка, которое приблизительно равно:

Код: Выделить всё

[f(x) for x in l if f(x)]
Где l — список, а f(x) — дорогостоящая функция, возвращающая список.
I хочу избежать вычисления f(x) дважды для каждого непустого появления f(x). Есть ли какой-нибудь способ сохранить его вывод в рамках понимания списка?
Я мог бы удалить последнее условие, сгенерировать весь список, а затем сократить его, но это кажется расточительным.Было предложено два основных подхода:
Понимание внутреннего генератора:

Код: Выделить всё

[y for y in (f(x) for x in l) if y]
или мемоизация.
Я думаю, что понимание внутреннего генератора элегантно подходит для решения поставленной проблемы. На самом деле я упростила вопрос, чтобы было понятно, очень хочу:

Код: Выделить всё

[g(x, f(x)) for x in l if f(x)]
Я думаю, что в этой более сложной ситуации мемоизация дает более чистый конечный результат.

Подробнее здесь: https://stackoverflow.com/questions/158 ... evaluation

Вернуться в «Python»