【问题标题】:AND/OR operator between numbers in Python [duplicate]Python中数字之间的AND/OR运算符[重复]
【发布时间】:2017-12-07 08:30:53
【问题描述】:

and/or 运算符如何在数字(甚至字符串)之间工作?

5 and 7  # this returns 7
7 and 5  # this returns 5
21 and 4 # this returns 4
4 and 21 # this returns 21

and 运算符在这种情况下如何工作?

【问题讨论】:

  • the documentation 对你没有帮助?
  • 计算结果为第一个“假”操作数。如果两个操作数都为“真”,则计算结果为最后一个操作数。
  • @Someprogrammerdude 谢谢!我错过了搜索文档。

标签: python


【解决方案1】:

与/或:
5 和 7 #7
它首先检查 5 并发现它是“真”,因此它也检查第二个并返回最后一个。

0 和 5 # 0
它首先检查并发现为零,因此无论下一个值是什么,它始终为零,因此它返回 0

2 或 3 和 4 #2
第一个值为 2 ('True') 并找到 OR 所以值总是 true 所以返回 2

(2 或 3)和 4 #4
现在返回 4。

【讨论】:

    【解决方案2】:

    它返回最后一个值 True(如果有任何 True 值)。

    对于and,python 需要检查每个值,所以如果它们都为真,则返回最后一个,如果其中一个为假,则返回该值。如果它们都为 False,则返回第一个,因为 Python 也不需要检查第二个。

    对于or,python 会首先检查第一个,直到某个时候他得到 True,所以如果第一个值为 True,则返回此值,如果第一个值为 False,但第二个值为 True,则返回第二个.如果它们都是 False,则返回最后一个。

    相当于 False 的值:"",0,False,0j, 0.0, [], {}, set()

    【讨论】:

    • 还有0j0.0[]{}set(),以及任何在用作布尔值时显式返回 False 的类。
    • 我会添加它们,但是由于@Yoessef13 只要求输入数字和字符串,所以我只有这些
    【解决方案3】:

    and 与整数一起使用时,如果所有值都不为零,它会给你最后一个值,如果至少有一个,它会给你最后一个值。

    1 and 2 and 3 #3
    1 and 0 and 3 #0
    

    【讨论】:

    • 不正确。试试"" and 6。你相信它是零。不是。
    • 呵呵... OP 询问整数 :)
    • 这个问题提到整数作为一个特定的情况,但比这更笼统:“我的问题是和/或运算符如何在数字(甚至字符串)之间工作”。 "" 是一个字符串。
    【解决方案4】:

    我们拆机吧!

    >>> import dis
    >>> def check_and(a, b):
    ...   return a and b
    ... 
    >>> dis.dis(check_and)
      2           0 LOAD_FAST                0 (a)
                  3 JUMP_IF_FALSE_OR_POP     9
                  6 LOAD_FAST                1 (b)
            >>    9 RETURN_VALUE        
    

    现在它非常简单。 1. 加载一个到堆栈(它变成TOS - 堆栈值的顶部。 2. JUMP_IF_FALSE_OR_POP 尝试评估 TOS(栈顶)的布尔值。如果是真的,从堆栈中删除这个值,如果不是,设置字节码计数器(在我们的例子中它会跳转到第 9 行。 3. 按 b 入栈。 4.返回。

    我无法真正说出为什么在另一种情况下评估顺序不同,但如您所见,如果第一个评估值是 True,则将返回第二个评估值。

    or 和其他运算符也是如此。尝试自己拆卸它们。

    如果您想快速检查,这会很方便。而不是写:

    def check(value)
      if value:
        return value
      else:
        return "No value"
    

    你可以写:

    def check(value):
      return value or "No value"
    

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2011-09-18
      • 2019-02-10
      相关资源
      最近更新 更多