在 Python 中将 IF、AND、OR 与 EQUAL 操作数一起使用

Using IF, AND, OR together with EQUAL operand together in Python

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

我的第一反应是使用这段代码:

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

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

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. 有什么方法可以为此编写更简洁的代码?

感谢您的帮助!

** 不是重复的问题,因为虽然这个问题具有相同的关于布尔运算符的基本概念,但由于 len()、isdigit() 的使用以及如何最好地改进它(有人评论了 return 的用法)。不过,肯定会为另一个问题添加另一个视角。

您可以像这样使用 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

你可能想写

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

而不是

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

有助于检查此行的逻辑:

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

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

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) ...

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

"or" 是布尔值或逻辑选择。 (4 或 6) 保证解析为非零(真)值。在本例中,它解析为 4,因此您的测试用例通过了。

问题出在您的 or 语句中。

当您将任何大于 1 的值置于条件语句中时,它的计算结果将是 True。所以 (4 or 6) 总是 解析为真。

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

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

它有点冗长,我觉得它更容易阅读。

我先回答

Any way to write cleaner code for this?

是的。 Return 布尔值,而不是打印字符串。

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

print(number("1234")) # True

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