我不久前开始学习python,这是我对Euler#1的原始解决方案:
n = 0
for i in xrange(1000):
if i % 3 == 0 or i % 5 == 0:
n += i
print n
我在网上找到了这个:
n = 0
for i in xrange(1000):
if not i % 3 or not i % 5:
n += i
print n
两者都得出正确答案(233168)。
我真的不明白'不是x%y'在迭代范围时,part正在评估为True / False。有人可以解决这个问题吗?
答案 0 :(得分:2)
x % y
的结果如果不为零则为True,因此符合以下条件:
if not i % 3
等于if i % 3 == 0
。
为了更好地理解,请参阅以下bool表:
i % 3 | not i % 3 | i % 3 == 0
True | False | True==0(false)-> False
False | True | False==0(false)->True
其中显示(not i % 3) is equal with (i % 3 == 0)
。
注意表中的True和False只是从if
条件角度而不是结果!
答案 1 :(得分:1)
%
是模运算符。在这个例子中
if i % 3 == 0 or i % 5 == 0:
如果i
可以被3或5整除,那将是真的。
%(modulo)运算符从第一个参数除以第二个参数得到余数。数字参数首先转换为通用类型。零右参数会引发ZeroDivisionError异常。参数可以是浮点数,例如,3.14%0.7等于0.34(因为3.14等于4 * 0.7 + 0.34。)模运算符总是产生与第二个操作数(或零)具有相同符号的结果;结果的绝对值严格小于第二个操作数的绝对值[2]。