在 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")
以上代码通过了所有测试。
所以我的问题是:
- 这是怎么回事?
- 有什么方法可以为此编写更简洁的代码?
感谢您的帮助!
** 不是重复的问题,因为虽然这个问题具有相同的关于布尔运算符的基本概念,但由于 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 语句中使用您的方法很简单。
我正在尝试创建一个函数,其中检查给定值(作为字符串传递)以查看位数是 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")
以上代码通过了所有测试。
所以我的问题是:
- 这是怎么回事?
- 有什么方法可以为此编写更简洁的代码?
感谢您的帮助!
** 不是重复的问题,因为虽然这个问题具有相同的关于布尔运算符的基本概念,但由于 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 语句中使用您的方法很简单。