2016-05-13 5 views
2

Я получил функцию:Изменить функцию использовать список comprehision в Python

def euler9(): 
    for b in range(1, 500): 
     a = (500000 - 1000 * b)/(1000 - b) 
     if a % 1 == 0: 
      print(b * a * (1000 - a - b)) 

И я хочу сделать это в одной строке, как

x*x for x in range(1,1) 

Это то, что я сделал:

def euler9(): 
    print([b * a * (1000 - a - b) for b in range(1, 500) for a in (500000 - 1000 * b)/(1000 - b) if a % 1 == 0]) 

но я не знаю, что я делаю неправильно. У меня есть ошибка: ТипError: объект «float» is not itable

+1

Похоже, вы пытаетесь увидеть ли '1000 - b' делит '500000 - 1000 * b'. Если это так, вы должны проверить, является ли '(500000 - 1000 * b)% (1000 - b) == 0', вместо того, чтобы выполнять деление с плавающей запятой и проверять, имеет ли результат дробную часть. Операции с плавающей точкой включают ошибку округления, которую вы не должны подвергать действию чисто целочисленной операции. – user2357112

+0

Это выглядит намного хуже в понимании списка, и оно будет менее эффективным, так как вам придется вычислять одни и те же вещи дважды. – ayhan

ответ

2

for предназначено для итерации (зацикливание). Когда вы говорите for b in range(1, 500), вы не устанавливаете b = range(1, 500), так как это сделает b список. Вы извлекаете каждое индивидуальное значение и используете их по одному. Вы не можете извлекать значения из поплавка.

Python не имеет синтаксис простого присваивания в списковых, но вы можете работать вокруг этого, помещая значение внутри списка одного элемента, что делает его итерацию:

[b * a * (1000 - a - b) for b in range(1, 500) for a in [(500000 - 1000 * b)/(1000 - b)] if a % 1 == 0] 

(Вы можете поместить print(...) вокруг если вы хотите, но я предполагаю, что вы действительно хотите использовать значения)

Но никогда не делайте этого, его трудно читать и не нужно.

1

Здесь for a in (500000 - 1000 * b)/(1000 - b) вы пытаетесь выполнить итерацию по числу с плавающей точкой, которое является результатом создания. Как быстро исправить, попробуйте следующее:

def euler9(): 
    print([b * ((500000 - 1000 * b)/(1000 - b)) * (1000 - ((500000 - 1000 * b)/(1000 - b)) - b) 
      for b in range(1, 500) if ((500000 - 1000 * b)/(1000 - b)) % 1 == 0]) 

Но, как вы видите, это становится немного грязным, что путь, и рекомендуются использовать петлю вместо списка понимания, когда все становится сложнее.

+0

, но здесь вы дублируете одинаковое выравнивание – siema

-1

Включите его в generator путем изменения print к yield:

def euler9(): 
    for b in range(1, 500): 
     a = (500000 - 1000 * b)/(1000 - b) 
     if a % 1 == 0: 
      yield (b * a * (1000 - a - b)) 

Тогда вы можете получить доступ к нему в качестве списка понимания:

print [x for x in euler9()] 
Смежные вопросы