while循环运行一次?

时间:2019-04-07 02:16:49

标签: python list function while-loop

编码新手,正在尝试解决此编码问题以进行学习。

提示:

  

如果我们列出10以下的所有自然数,它们是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。找到下面3或5的所有倍数的总和。 1000。

three = []
five = []

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1
        return three

def fiveList():
    n = 1
    while (n*5<1000):
        result = n*5
        five.append(result)
        n += 1
        return five

threeList()
fiveList()

print(three,five)

这将在控制台上打印[3] [5]。

3 个答案:

答案 0 :(得分:3)

您的return是循环的一部分,这意味着在迭代结束时,您只需从函数中return就可以进行另一次迭代。将其移出循环,即:

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1
    return three

return毫无意义,因为您正在返回全局变量。没有意义返回已经可用的东西(我建议您阅读有关variable scope的信息),因此完全摆脱这些return都是安全的:

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1

实际上,由于两个函数的差异很小,因此您应该重构代码,只有一个函数接受乘数(因为这是唯一的区别)并返回填充列表。这次我们使用局部变量来创建结果列表,因此这次您需要return,否则result列表将在函数之外不可用:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

然后替换

threeList()
fiveList()

使用

three = my_func(3)
five = my_func(5)

实际上,您可以将其与print()合并,因为threefive没有其他用途,因此您的最终代码应如下所示:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

print(my_func(3), my_func(5))

答案 1 :(得分:3)

除了Marcin的出色答案之外,请注意,您还可以提前算出要使用哪些元素的数学运算,并完全避免使用while循环。 range是您的朋友。

multiples_of_five = range(5, 1001, step=5)
multiples_of_three = range(3, 1001, 3)

由于range的止损点是排他性的,但是我们希望3和5的所有倍数最多达到1000个 ,我们必须在{ {1}}。这简化了Marcin在上方放置的1001

my_func

尽管如果我们仔细研究一下,您会发现我们基本上只是在投射到列表并返回。让我们直接这样做。

def list_multiples(n):
    result = []
    for i in range(n, 1001, n):
        result.append(i)
    return result

从那里我们可以找到5的倍数和3的倍数

def list_multiples(n):
    return list(range(n, 1001, n))

投射到fives = list_multiples(5) threes = list_multiples(3) 以删除重复项(15是5和3的倍数,但不应相加两次)

set

对结果求和

all_nums = set(fives + threes)

答案 2 :(得分:0)

要以Python方式解决问题,请将sum()generator expression结合使用,例如:

代码:

sum(i for i in range(1000) if i % 5 == 0 or i % 3 == 0)

测试代码:

max_num = 1000
print(sum(i for i in range(max_num) if i % 5 == 0 or i % 3 == 0))

结果:

233168