在Python中一起使用IF,AND,OR和EQUAL操作数

时间:2016-07-20 17:03:40

标签: python boolean conditional operand

我正在尝试创建一个函数,其中检查给定值(作为字符串传递)以查看数字位数是4还是6,并且它是一个数字。

我的第一个冲动是使用这段代码:

def number(x):
    if (len(x) == (4 or 6)) and x.isdigit():
        print "True"
    else:
        print "False"

上面的代码只通过了下面的第一个测试...我不明白为什么它通过了这个,但没有其他测试:

number("1234")

只有当我分离出len()函数时才能正常工作。

def number(x):
    if (len(x) == 4 or len(x) == 6) and x.isdigit():
        print "True"
    else:
        print "False"


## Checks
number("1234")
number("123456")
number("abcd")
number("abcdef")
number("1")
number("a")

以上代码通过了所有测试。

所以我的问题是:

  1. 这里发生了什么?
  2. 是否可以为此编写更清晰的代码?
  3. 感谢您的帮助!

    **不是一个重复的问题,因为虽然这个问题与布尔运算符有相同的基本概念,但问题本身是不同的,因为len(),isdigit()的使用,以及如何最好地改进它的附加问题(有人评论了返回的用法)。绝对可以为另一个问题添加另一个视角。

6 个答案:

答案 0 :(得分:6)

您可以使用in运算符,如下所示:

def number(x):
    if len(x) in (4, 6) and x.isdigit():
    print "True"
else:
    print "False"

其中in检查给定容器中的包含。请注意,4 or 6自己评估为不合需要的东西,这就是您的第一个代码段失败的原因。你可以在python shell上查看它:

>>> 4 or 6
4

答案 1 :(得分:5)

有助于检查这一行的逻辑:

if (len(x) == (4 or 6)):

(4 or 6)子句包含逻辑or短路。值4为true,因此会对其进行求值并返回==关系比较。

or的工作方式是对其左侧进行布尔真值计算,如果为真则返回其值。如果左侧不是布尔值true,则评估右侧并返回其值。

因为4 or ...的左侧在布尔意义上是真的,所以从不评估右侧。 Python甚至看不到4 or。如果左侧值为假值(例如0),则将评估or的右侧。

要查看此操作,请尝试print 4 or 6。输出为4。

因为4是一个硬编码的真值,你的比较在语义上与if (len(x) == 4)相同 - 也就是说,因为4是真的,所以6永远不会被评估。

我想您真正想知道的是len(x)是4还是6。您可以通过以下几种方式将其添加到代码中:

if(len(x) == 4 or len(x) == 6 ...

if(len(x) in (4,6) ...

答案 2 :(得分:2)

简答:len(x) in [4, 6]len(x) == 4 or len(x) == 6

"或"是一个布尔或逻辑选择。 (4或6)保证解析为非零(真)值。在这种情况下,它会解析为4,因此您的测试用例会通过。

答案 3 :(得分:1)

你可能想写

if (len(x) in (4, 6)) and x.isdigit():

而不是

if (len(x) == (4 or 6)) and x.isdigit(): 

答案 4 :(得分:1)

我会继续回答

  

是否可以为此编写更清晰的代码?

是。 返回布尔值,而不是打印字符串。

def number(x): 
    return len(x) in {4, 6} and x.isdigit()

print(number("1234")) # True

然后,在没有字符串比较的if语句中使用您的方法很简单。

答案 5 :(得分:0)

麻烦在于您的or声明。

当您将其置于条件中时,任何大于1的值都将评估为True。因此(4 or 6)始终解析为true。

您可以使用上面的in语句,也可以只使用两个==

if (len(x) == 4 or len(x) == 6) and x.isdigit()

它有点啰嗦,我觉得它更容易阅读。