修改函数以在Python

时间:2016-05-13 20:05:49

标签: python list-comprehension

我有一个功能:

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'对象不可迭代

3 个答案:

答案 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()]