我正在尝试创建一个函数,其中检查给定值(作为字符串传递)以查看数字位数是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")
以上代码通过了所有测试。
所以我的问题是:
感谢您的帮助!
**不是一个重复的问题,因为虽然这个问题与布尔运算符有相同的基本概念,但问题本身是不同的,因为len(),isdigit()的使用,以及如何最好地改进它的附加问题(有人评论了返回的用法)。绝对可以为另一个问题添加另一个视角。
答案 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()
它有点啰嗦,我觉得它更容易阅读。