这段代码中的逻辑错误?

gib*_*b19 0 python python-2.x

代码很简单,一旦你看到它就能告诉你它做了什么.

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'
Run Code Online (Sandbox Code Playgroud)

它工作正常,但它只显示2个案例的错误.当输入时18,它表示'Not Weird'输出应该是'Weird'.输入时也会发生同样的事情20.这可能是一个愚蠢的错误或其他什么,但我似乎无法把手指放在它上面,我需要有人看看它.

wim*_*wim 5

这种情况不符合你的想法:

>>> n = 18
>>> n >= 2 & n <= 5
True
Run Code Online (Sandbox Code Playgroud)

它实际上是这样做的:

>>> n >= (2 & n) <= 5
True
Run Code Online (Sandbox Code Playgroud)

证明:

>>> 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)]))])"
Run Code Online (Sandbox Code Playgroud)

关于运算符优先级的docs参考在这里.

相反,使用这个:

2 <= n <= 5
Run Code Online (Sandbox Code Playgroud)