Я часто нахожу, что хочу писать описания списков Python следующим образом:
nearbyPoints = [(n, delta(n,x)) for n in allPoints if delta(n,x)<=radius]
Это, надеюсь, дает некоторый контекст относительно того, почему я хотел бы это сделать, но там также являются случаями, когда необходимо вычислить/сравнить несколько значений Элемент:
newlist = [(x,f(x),g(f(x))) for x in bigList if f(x)<p and g(f(x))<q]
У меня есть два вопроса:
- все эти функции будут оцениваться несколько раз или результат кэшируется? Указывает ли язык или является ли он специфичным для реализации? Я использую 2.6 сейчас, но будет 3.x быть другим?
- Есть ли более простой способ написать его? Иногда f и g - длинные выражения и дублирование подвержено ошибкам и выглядит беспорядочно. Я бы очень хотел, чтобы напишите это:
newList = [(x,a=f(x),b=g(a)) for x in bigList if a<p and b<q]
но это не сработает. Есть ли веская причина не поддерживать этот синтаксис? Можно это можно сделать с помощью этого? Или мне просто нужно использовать несколько listcomps или for-loop?