Используя приведенное ниже, мы можем видеть, что x.giveMyNum() будет вызываться 4 раза - 3 раза, чтобы проверить значение myNum и один раз, чтобы построить возвращаемый список. Вероятно, вы хотите, чтобы его вызывали только 3 раза, так как это чистая функция, и ее значение не изменится.Предотвращение множественных вызовов в понимании списка
Список Постижение Версия:
class test(object):
def __init__(self,myNum):
self.myNum=myNum
def giveMyNum(self):
print "giving"
return self.myNum
q=[test(x) for x in range(3)]
print [x.giveMyNum() for x in q if x.giveMyNum()>1]
Я знаю, что вы можете сделать что-то вроде этого, чтобы исправить это:
ret=[]
for x in q:
k=x.giveMyNum()
if k>1:
ret.append(k)
но есть способ, чтобы предотвратить дополнительный вызов в списке понимание?
Мне не нужно сохранять промежуточное значение.
Мне нравится функциональный код. Это очень читаемо. – Carbon
@ProbablyAStupidQuestion, тогда вам может понравиться 'filter (lambda n: n> 1, map (test.giveMyNum, q)))';) –
, что очень приятно! Я грустный фильтр перемещается в itertools в Python3. – Carbon