我有一个功能:
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])
但我不知道我做错了什么。我有一个错误: TypeError:'float'对象不可迭代
答案 0 :(得分: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 :(得分:1)
这里for a in (500000 - 1000 * b) / (1000 - b)
你试图迭代一个浮点数,这是一个devision的结果。
快速解决这个问题:
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])
但是,正如你所看到的那样,它变得有点混乱,当事情变得复杂时,建议使用循环而不是列表理解。
答案 2 :(得分:-1)
将print
更改为yield
,将其变为generator:
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()]