Python 3和5的倍数|将倍数附加到列表

Python 3和5的倍数|将倍数附加到列表,python,Python,我学习Python还不到一个月,目前正在从事Euler项目 讽刺的是,我被第一个问题难住了。看看下面我的应用程序road,我想知道我在哪里搞砸了。或者使用错误的逻辑 如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23 求1000以下所有3或5的倍数之和 我的逻辑/代码流 sum = multiple_three + multiple_five multiple_three = [] multiple_five = [] def multiple_t

我学习Python还不到一个月,目前正在从事Euler项目

讽刺的是,我被第一个问题难住了。看看下面我的应用程序road,我想知道我在哪里搞砸了。或者使用错误的逻辑

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

求1000以下所有3或5的倍数之和

我的逻辑/代码流

sum = multiple_three + multiple_five
multiple_three = []
multiple_five = []

def multiple_three(bignumber):
    for number in range(bignumber):
        if number % 3 == 0:
            multiple_three.append(number)

def multiple_five(bignumber):
    for number in range(bignumber):
        if number % 5 == 0:
            multiple_five.append(number)

bignumber = 1000
multiple_five(bignumber)
multiple_three(bignumber)

print multiple_three
print multiple_five

这就是我的工作。让我知道这对你是否也有效

def multiples_of_3_or_5():
    for number in xrange(1000):
        if not number % 3 or not number % 5:
            yield number

print sum(multiples_of_3_or_5())

您没有打印sum。但除此之外,你要数到像15这样的数字两次,即3和5的倍数。 一个快速的解决办法是

 print(sum(set(multiple_three+multiple_five)))
这里的multiple_三+multiple_五给出了一个串联列表。set标识唯一的元素,sum将输出sum。更好的方法是使用“or”运算符,并按照@Destry Amiott的建议将数字附加到单个循环中

让我们看看

我们可以从range有一个step参数这一事实开始。所以像
range(0,10,3)
这样的东西会得到
0,3,6,9

因此,首先,我们有

sum(range(0,1000,3)) + sum(range(0,1000,5))
但是等等!可被15整除的数字可被5和3整除!我们数到两次了!呃,呃,让我们减去它们

sum(range(0,1000,3)) + sum(range(0,1000,5)) - sum(range(0,1000,15))
哼。我想我们还是缺少一些东西。有没有更简单的方法把算术级数相加?可以发誓有

类似于(a_0+a_n)*n/2,其中n是项数,可能

def sum_of_arithmetic_progression(start,stop,step):
    n = (stop-start)//step #floor division :P
    end = start + step*n
    return (start + end)*n/2.0

sum_of_arithmetic_progression(0,1000,3)+sum_of_arithmetic_progression(0,1000,5)-sum_of_arithmetic_progression(0,1000,15)

大家好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。你可能也想了解。那么到底是什么问题呢?哇。因此,变量和函数名不能相同。知道了!谢谢你,摩根!我现在只是想把名单填好。然后我想处理将它们相加并打印“Sum”的问题。我解决这个问题的总体逻辑正确吗?还是我工作太努力了?请记住,有些数字(如15)将是3和5的倍数。有许多错误,例如在定义函数之前调用函数,以及在没有
的情况下调用函数()
并且不返回值,请多学习,谢谢你的帮助,哈哈,我不认为我得到了全部!谢谢你的帮助。快速提问。。1) 为什么使用xrange而不是range?2) 为什么“如果不是数字%3或不是数字%5:”如果是数字%3(如果数字可以被3整除),那么它不应该是唯一的吗?没问题,xrange是这样描述的。Range创建了一个列表,所以如果您使用Range(1100000)它在内存中创建了一个包含10000000个元素的列表。xrange是一个生成器,所以它是一个序列对象,是一个惰性求值的对象。在这里可以找到。它这样做的原因是,对于计算机来说,这样做更快,因为计算机不在乎它以哪种方式完成。为什么要使用if而不是if?试试看解释得比我好你会自动想到这个惊人的逻辑还是需要时间和实践?这太令人印象深刻了!我的方法是糟糕的还是太多的工作了?顺便说一句,谢谢你,我已经读了10遍了,我试图理解你是怎么想的(a_0+a_n)*n/2部分嗯,它涉及谷歌搜索“求和算术级数“:P但是你可以用一些时间和一些图表来证明这一点:P你的方法很幼稚,但对于刚刚开始学习python的人来说并不意外:P随着时间的推移,你也会学到很多东西,这使事情变得容易。我们在午餐时测试了这一点,与15的关系变得非常明显。我正要提到它。伟大的工作+1@goldkin请参阅(这与求和不同,求和既费力又耗时,而且是算术,而不是数学)。