此代码中的逻辑错误?

Logical mistake in this code?

代码简单,一看便知。

n = int(input())
if(n%2!=0):
    print 'Weird'
elif(n%2==0):
    if(n>=2 & n<=5):
        print 'Not Weird'
    elif(n>=6 & n<=20):
        print 'Weird'
    elif(n>20):
        print 'Not Weird'

它工作正常,但仅显示 2 个案例的错误。当输入是 18 时,它表示 'Not Weird' 而输出应该是 'Weird'。当输入为 20 时,也会发生同样的事情。 这可能是一个愚蠢的错误或其他什么,但我似乎无法确定它,我需要有人看一下。

此条件与您认为的不同:

>>> n = 18
>>> n >= 2 & n <= 5
True

实际上是这样做的:

>>> n >= (2 & n) <= 5
True

证明:

>>> import ast
>>> ast.dump(ast.parse('n >= 2 & n <= 5'), annotate_fields=False)
"Module([Expr(Compare(Name('n', Load()), [GtE(), LtE()], [BinOp(Num(2), BitAnd(), Name('n', Load())), Num(5)]))])"
>>> ast.dump(ast.parse('n >= (2 & n) <= 5'), annotate_fields=False)
"Module([Expr(Compare(Name('n', Load()), [GtE(), LtE()], [BinOp(Num(2), BitAnd(), Name('n', Load())), Num(5)]))])"

有关运算符优先级的文档参考是 here

改为使用:

2 <= n <= 5

将运算符 & 更改为 and& 是位运算符。

只是稍微修改了您的代码以摆脱 & 。您可以在 if/elif 语句

中组合范围
n = int(input())
if(n%2!=0):
    print ('Weird')
elif(n%2==0):
    if(2<=n<=5):
        print ('Not Weird')
    elif(6<=n<=20):
        print ('Weird')
    elif(n>20):
        print ('Not Weird')