使用布尔值或布尔值排序评估

时间:2010-08-23 03:32:41

标签: python boolean or-operator

所以我有这段代码。它起作用(它说1是非素数)。:

n = 1
s = 'prime'
for i in range(2, n / 2 + 1):
    if n == 1 or n % i == 0:
        s= 'non-' +s
        break

print s

我的问题是,如果我将第四行更改为:if n % i == 0 or n == 1:,它就不起作用(它表示1是素数。)

为什么?由于我使用的是or,因此它们中的任何一个都是True,因此订单不计算在内吗?

(我还在学习布尔值,所以我可能会犯一些基本错误。)

提前致谢!

编辑:感谢您的回答;我从未意识到range()函数的问题。关于代码工作和不工作:我不知道发生了什么。我可能在某个地方犯了一些错误(也许在运行脚本之前忘了保存。虽然我可以发誓它的工作方式不同:P)。也许我只是累了......

谢谢你的答案!

5 个答案:

答案 0 :(得分:2)

在这两种情况下,循环体都不会运行,因为当'n'为1时,它不在(n,n / 2 + 1)范围内

你发布的代码说1是素数(再次,因为循环体根本不执行)

答案 1 :(得分:1)

我认为问题是当n为1时,跳过循环。

答案 2 :(得分:1)

优先顺序为fine。首先评估%,然后评估==,然后评估or,以便将其细分为:

     ___or___
    /        \
  ==          ==
 /  \        /  \
n    1      %    0
           / \
          n   i

您的问题是您的for循环根本没有被执行,因此s仍然设置为"prime"

2,n/2+1为1时的范围n等同于2,1,这将导致正文无法执行。

事实上,由于n为2且范围2/2+1未执行,因此2,2为2时不会执行。这些值是起始值和终止值,而不是开始和结束(最后)值 - 由于s的初始化,2被认为是素数,这只是偶然的: - )

请改为尝试:

#!usr/bin/python

n = 9
s = 'prime'
if n == 1:
    s = 'non-prime'
else:
    i = 2
    while i * i <= n:
        if n % i == 0:
            s= 'non-prime'
            break
        i = i + 1
print s

一直到n/2都是浪费,n的平方根就是所需要的。

答案 3 :(得分:1)

其他答案已经正确地解决了您的具体问题(换句话说,只有在n/2 + 1 > 2时才会执行循环,即n/2 > 1,这意味着n > 2具有新的问题样式划分[[python 3或从未来​​合适的导入或标志...]],n > 3与经典样式截断除法。)

你提出的具体问题:

  

因为我正在使用或应该是那样的   其中一个是真的所以   订单不算?

订单 计算,因为or(如and)是一个短路运算符:具体而言,or 保证从左到右,如果左操作数为真,则停止(因为它不需要知道正确的操作数)。这与您的特定代码无关,但在例如:

等情况下这一点至关重要
if i == 0 or n / i > 3: ...

如果or没有从左到右(并且尽快停止),即使i等于0,右手操作数也可能会被执行 - 但是师会提出例外!使用Python的规则,此代码片段不会引发异常(如果i至少是int,则为 - )。

再说一遍:这与你所遇到的具体问题无关(见其他答案和这个问题的开头),但是对你来说很重要,因为你问过,我拿了有机会解释! - )

答案 4 :(得分:0)

for n in range(101):
    s = 'prime'
    if n < 2 or not (n & 1): ## not(n & 1) == is even number (last bit 0) == not (n % 2) 
        s = 'non-'+s
    else:
        for i in range(3, int(n**0.5) + 1,2):
             if not(n % i):
                 s= 'non-' +s
                 break
    print "%i is %s" % (n,s)

您无需检查所有偶数,您可以在n的平方根处停止检查。