【问题标题】:Using IF, AND, OR together with EQUAL operand together in Python [duplicate]在 Python 中一起使用 IF、AND、OR 和 EQUAL 操作数 [重复]
【发布时间】:2016-11-24 00:09:35
【问题描述】:

我正在尝试创建一个函数,其中检查给定值(作为字符串传递)以查看位数是 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. 有什么方法可以为此编写更简洁的代码?

感谢您的帮助!

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

【问题讨论】:

  • 提示:(4 or 6) 自己评估什么? len(x) 等于吗?
  • 不是重复的。差远了。是的,这两个问题都可以通过阅读同一套手册来解决,但不能重复。

标签: python boolean conditional operand


【解决方案1】:

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

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

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

or 的工作方式是它的左边被评估为布尔真值,如果为真则返回它的值。如果左边不是 Boolean 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) ...

【讨论】:

  • 奇怪的是,在我的情况下,它的行为不同:这里都考虑了>if file.endswith(".log") or file.endswith(".blg"):这里只考虑了左侧>if file.endswith(".log" or ".blg"):
【解决方案2】:

我会继续回答

有什么方法可以为此编写更简洁的代码?

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

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

print(number("1234")) # True

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

【讨论】:

  • 谢谢。为了扩展这一点——如果你想为这两个函数计时,你会怎么做?我在控制台中尝试了 [ Python -m timeit "import compatible; compatible.number() ] ......但它不起作用。simplified.py 是该函数所在的文件的名称。
  • 不确定。从未使用过timeit。不过我想说这更快,因为没有 if-else 条件
【解决方案3】:

问题出在您的or 声明中。

当你把它放在一个条件中时,任何大于一的值都将评估为True。所以(4 or 6)总是解析为真。

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 阅读您的回复后,它在我的脑海中点击了 - 谢谢。对于其他阅读本文的人 - 我犯的严重错误是没有将 OR 视为布尔值。
    【解决方案5】:

    你可能想写

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

    代替

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-24
        • 2014-05-01
        • 2021-11-23
        • 2010-12-20
        相关资源
        最近更新 更多