У меня есть hack
для создания псевдонимов в списках / словах.Вы можете использовать трюк for alias_name in [alias_value]
.Например, у вас есть эта дорогая функция:
def expensive_function(x):
print("called the very expensive function, that will be $2")
return x*x + x
И некоторые данные:
data = [4, 7, 3, 7, 2, 3, 4, 7, 3, 1, 1 ,1]
И затем вы хотите применить дорогую функцию к каждому элементу, а также фильтровать на основе этого.То, что вы делаете:
result = [
(x, expensive)
for x in data
for expensive in [expensive_function(x)] #alias
if expensive > 3
]
print(result)
Second-for будет перебирать только список размера 1, фактически превращая его в псевдоним.Вывод покажет, что дорогая функция вызывается 12 раз, ровно один раз для каждого элемента данных.Тем не менее, результат функции используется (самое большее) дважды, один раз для фильтра и один раз возможно один раз для вывода.
Пожалуйста, всегда проверяйте компоновку таких пониманий, используя несколько строк, как я, идобавьте #alias к строке, где находится псевдоним.Если вы используете псевдоним, понимание становится довольно сложным, и вы должны помочь будущим читателям вашего кода получить то, что вы делаете.Вы знаете, это не perl;).
Для полноты выведите:
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
called the very expensive function, that will be $2
[(4, 20), (7, 56), (3, 12), (7, 56), (2, 6), (3, 12), (4, 20), (7, 56), (3, 12)]
Код: http://ideone.com/7mUQUt