【Python】详解 逻辑运算符 (and / or / not) + 布尔逻辑 (bool) | 您所在的位置:网站首页 › python的运算顺序 › 【Python】详解 逻辑运算符 (and / or / not) + 布尔逻辑 (bool) |
目录 一、绪论 二、说明 2.1 关于 bool 逻辑值 (十分重要) 2.2 and —— bool “与” 逻辑运算符 2.3 or —— bool “或” 逻辑运算符 2.4 not —— bool “非” 逻辑运算符 2.5 逻辑运算符混用与优先级等问题 一、绪论以前看过的一些教程及网上资源对 Python 逻辑运算符部分的叙述都很简单,给出定义加上几个小例子就完事了。然而,后来才发现事情比想象中的要复杂一些,还是希望整理清楚一些。^ ^ 运算符逻辑表达式简要说明 and x and y布尔"与" - 若 x 为 False,x and y 返回 False,否则返回 y 的计算值 or x or y布尔"或" - 若 x 为非 0,则返回 x 的值,否则返回 y 的计算值 not not x布尔"非" - 若 x 为 True,返回 False;若 x 为 False,返回 True 二、说明 2.1 关于 bool 逻辑值 (十分重要)关于 变量/对象 的 bool 逻辑值,通常仅 0、''、[]、()、{}、None、False (及各种空容器) 为 False,其余均为 True。 对于 类实例,默认为 True,但也可自定义方法使运算值为 False (如 return False)。 关于其他 布尔表达式,则取决于其运算结果的 bool 逻辑。 # 使用 bool() 函数判断变量/对象、表达式、类实例等的 bool 逻辑值 >>> bool(0) False >>> bool('') False >>> bool([]) False >>> bool(()) False >>> bool({}) False >>> bool(None) False >>> bool(False) False >>> bool(1>2) False >>> bool(1>> bool(1==2) False >>> bool(1 is 2) False >>> bool(1 is not 2) True >>> bool(1 in [1, 2]) True >>> bool(1 not in [1, 2]) False关于 bool 逻辑表达式,远不止上述种类,许多 Python 关键字的使用都能构造出来。 然而,有一种流行的错误说法是:逻辑运算符用于操作 bool 类型的表达式,执行结果也是 bool 类型。事实上,Python 逻辑运算符可用于任何类型的表达式,表达式为 bool 类型只是充分不必要条件;同时,逻辑运算的结果可为任意类型,而不一定是 bool 类型,(注意,准确地说,用于运算的表达式及其结果的 bool 逻辑值是一定为 True 或 False) 例如: # 只要 bool 逻辑值为 True 或 False 之一, 无论什么类型都能使用逻辑运算符 >>> 1 and 'csgo' 'csgo' >>> [6,6,6] or [8,8,8] [6, 6, 6] >>> not {"C", "T"} False # 用于运算的表达式, 其 bool 逻辑值一定为 True 或 False >>> bool(1) True >>> bool('csgo') True >>> bool([6,6,6]) True >>> bool([8,8,8]) True >>> bool({"C", "T"}) True此外,还有一些 sao 操作,但没事不建议这么写,有兴趣可以看一下: >>> True == 1 # 就是这么定的, 因为 bool 型是 int 型的一个子类 True >>> False == 0 True >>> True + 1 # 就是这么算的 —— bool 值的非 bool 运算 2 >>> True + False 1还有一道 LeetCode / 剑指 Offer 经典题 不得不提: 求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 (A?B:C)。 示例 1: 输入: n = 3输出: 6限制: 1 >> 1 and 0 and [] and None 0 >>> 1 and '' and {} and () and False '' # 若 bool 上下文中所有值均为 True, 则返回从左到右的最后一值!!!!而不一定返回 True >>> 1 and 2 # 返回最后一个 2 2 >>> 1 and 2 and 3 and 4 # 返回最后一个 4 4除了 2.1 节的 LeetCode 题,and 的用处还很多,例如: 判断一个 list 末端元素是否 >0,由于不确定 list 是否为空,直接下标索引取值可能会引发 error。如果不想多写个 if 判断 list 是否非空,可以这么写: >>> lst = [] >>> if lst[-1] > 0: print("last element > 0") Traceback (most recent call last): File "", line 1, in if lst[-1]>0: IndexError: list index out of range >>> if lst and lst[-1] > 0: print("last element > 0") # 如此即便 lst 为空也不会抛出异常 2.3 or —— bool “或” 逻辑运算符已知 or 虽也执行 bool 逻辑运算,但并不总是返回 True 或 False,而是返回用于比较的值之一。 使用 or 时,从左到右 进行逻辑运算 (判定输出结果)。一旦遇到 bool 逻辑为 True 的值,则 立刻返回该值 且不再往后运算;否则,所有元素的 bool 逻辑值均为 False,or 将返回 最后一个值。 为什么这样呢?同样不难理解,按照 “或” 逻辑 —— “一真即真,全假才假”,为判断 or 表达式中是否存在 bool 逻辑为 True 的值,需要从左往右遍历,依次判断是否有 “真”。一旦遇到 bool 逻辑为 True 的 “真货”,则返回它 (而不一定返回 True !),相当于宣告了 or 表达式为真,不论后面有什么也无需再往后演算 (短路操作)。如果一直遇到 “假货” 直至结束,则返回最后一个值 (而不一定返回 False !),相当于宣告了 or 表达式为假。 # 从左到右依次演算, 一旦遇到 bool 为 True 的值, 立即返回之, 不再往后演算 >>> 1 or 2 1 >>> 1 or 2 or 3 or 0 1 # 若 bool 上下文中所有值均为 False, 则返回从左到右的最后一值!!!!而不一定返回 False ! >>> 0 or False # 返回最后一个 False False >>> '' or {} or () # 返回最后一个 () () >>> 0 or [] or None # 无显式返回 (返回最后一个 None) 2.4 not —— bool “非” 逻辑运算符not 执行 bool 逻辑运算,只返回 True 或 False,注意区别! not 运算符用起来简单,若元素的 bool 逻辑值为 True,则 n ot 表达式返回 False;若元素的 bool 逻辑值为 False,则返回 True。一言以蔽之 —— 跟你唱反调... # 一目了然, 无需多言 >>> not 1 False >>> not 0 True >>> not [6,6,6] False >>> not [] True 2.5 逻辑运算符混用与优先级等问题注意,Python 的 bool 逻辑运算符是 and、or、not,而非 &、||、~ (二进制位运算的逻辑与、或、非)。 以上说明的 and 及 or 的运算顺序都是 从左往右,但这都是在没有圆括号 “()” 和逻辑运算符混用的前提下的简单情况。 如果存在更复杂的情况,则存在 运算优先级:() > not > and > or
|
CopyRight 2018-2019 实验室设备网 版权所有 |