我希望使用以下代码找到低于1000的3或5的倍数:
a=[]
b=[]
def multiples_of_3():
i=1
for i in range(330):
m=i*3
if(m<1000):
a.append(m)
def multiples_of_5():
j=1
for j in range(330):
k=j*5
if(k<1000):
b.append(k)
if __name__ == "__main__":
multiples_of_3()
multiples_of_5()
print sum(a) + sum(b)
结果 - 262355
结果不对。它应该是233168。我在这里的逻辑怎么出错?
答案 0 :(得分:1)
您正在循环错误的范围并添加两次15的倍数。
我认为这是对您的计划的最小改动,使其有效:
a=[]
b=[]
def multiples_of_3():
i=1
for i in range(334): # stops at 1 less than the value passed to `range`
m=i*3
if(m<1000):
a.append(m)
def multiples_of_5():
j=1
for j in range(330): # could change to 201 and still work
k=j*5
if(k<1000):
b.append(k)
if __name__ == "__main__":
multiples_of_3()
multiples_of_5()
print sum(set(a+b))
但你应该重新考虑一下你的做法。使用全局变量通常是一个坏主意 - 查看调用multiples_of_3()
,无法知道子例程对这些倍数的作用;变量a
未在任何地方引用,但在行之前和行之后它有两个不同的值。所以对于初学者,我会将子程序转换为纯函数 - 让它们返回数组而不是修改全局变量。
作为次要的风格点,你也不需要在两个函数中使用不同的变量名,因为它们都是本地的。你不需要在循环之前为i
分配任何内容(循环将为你创建变量),并且你不需要围绕Python的条件使用括号{{{ 1}}语句(冒号负责分隔它):
if
您还可以将两个def multiples_of_3():
a = []
for i in range(334):
m = i * 3
if m < 1000:
a.append(m)
return a
def multiples_of_5():
a = []
for i in range(201):
m = i * 5
if m < 1000:
a.append(m)
return a
if __name__ == "__main__":
a = multiples_of_3()
b = multiples_of_5()
print sum(set(a+b))
函数合并为一个通用函数,该函数接受一个参数,告诉它返回的乘数:
multiples_of
您甚至可以将最大值转换为可选参数:
def multiples_of(k):
result = []
for i in range(1000/k+1):
multiple = i * k
if multiple < 1000:
result.append(multiple)
return result
无论哪种方式,你的主要部分都会变成这样:
def multiples_of(k, under=1000):
result = []
for i in range(under/k+1):
multiple = i * k
if multiple < under:
result.append(multiple)
return result
最后,作为一个参考点,可以将整个事物作为一个单行。在这里,我已经通过实际进行乘法来建立多个列表,只是循环遍历1000以下的所有数字并通过3或5测试它们的可分性:
a = multiples_of(3)
b = multiples_of(5)
print sum(set(a+b))
答案 1 :(得分:0)
由于您使用的是5的倍数,不应该for j in range(330):
为for j in range(200):
吗?