编码新手,正在尝试解决此编码问题以进行学习。
提示:
如果我们列出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]。
答案 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()
合并,因为three
和five
没有其他用途,因此您的最终代码应如下所示:
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