网站首页 > 技术文章 正文
概述
bool 是 python 内建数据类型,其取值只有 True 和 False;python 的逻辑运算符有 not,and,or
看上去很简单,所以当我第一次看到下面的代码时我是懵逼的
Bash
id = item.get('id') or ''
作为一个主要使用 Java 的程序员来说,只有逻辑类型的变量才可以使用逻辑运算符,已经成了思维定式,对于 python,这些思维定式反而成了障碍
python 逻辑判断
python 的所有变量都可以进行逻辑比较,其中,如下变量的 bool 值总是 False
Bash
0, 0.0, [], {}, (), "", '', None, False
如何理解这个结论呢?
- None:总是 False,这是 python 语言特性
- 数值:对于数值 n,如果 n==0,那么 n 的 bool 值就是 False,反之为 True
- 对于集合/字符串/或其他类型 x,如果 len(x)==0,那么 x 的 bool 值就是 False,反之为 True
- 对于方法,其 bool 值总是 True,所以一定要注意,在逻辑表达式里不要忽略了方法的括号
- 自定义的类,其实例对象的 bool 值总是 True,如果想要改变,可以实现如下方法
- __bool__()
- __len__()
- 如果同时存在 __bool__(),__len__(),则 __bool()__ 优先
python 的 or 和 and 运算符
回到本文的开头,来看下 or 运算符
首先要明确一点:python 的 or 并不保证只返回 bool 值,即 True 或 False
or 运算有个短路特性,即遇到第一个 True 时就可以返回,不需要计算后续的表达式,而且它返回的是第一个为 True 的变量,并不一定是 True,比如说 1 也是 True,那么返回的就是 1,示例如下
>>> 0 or 1 or None or True
1
如果 or 没有发生短路,即计算到最后一个值还是没有遇到 True,那么会返回这最后的一个值,所以本文最初的代码,其含义如下
# 如果 item.id 是 None,则 id 值为 ''
id = item.get('id') or ''
这相当于给 id 一个默认值 '' 来避免其值为 None,因为对应的数据库字段可能不允许为 null
同样的,and 也有短路特性,它遇到第一个 False 就可以返回对应的变量,或者返回最后一个变量,示例如下
>>> 1 and {'x':1} and [] and True
[]
>>> 1 and True and [1,2] and [3,4]
[3, 4]
python 的 not
not 就比较特殊了,它返回的是 bool 值,即 True 或 False,示例如下
>>> not None
True
>>> not 100
False
>>> not [1]
False
>>> not {}
True
python 方法参与逻辑运算
python 的方法本身也是对象,可以赋值给变量
前面已经说了,方法的 bool 值总是 True,所以要小心,忘记给方法写上括号是会导致奇怪的问题的,排查起来很痛苦,示例如下
# 定义一个方法,总是返回 False
>>> def always_false():
... return False
# 预期打印出 bad
>>> x = always_false()
>>> if x:
... print('ok')
... else:
... print('bad')
...
bad
# 不慎没有写方法后的括号,导致运行错误
>>> x = always_false
>>> if x:
... print('ok')
... else:
... print('bad')
...
ok
猜你喜欢
- 2025-01-18 Python机器学习库Sklearn系列教程(14)-逻辑回归
- 2025-01-18 Google裁撤Python团队的背后逻辑
- 2025-01-18 快乐8预测遗传算法的实现逻辑
- 2025-01-18 Python电子发票管理工具4:前后端业务逻辑实现
- 2025-01-18 Python之短路逻辑和运算符优先级
- 2025-01-18 【Python特征工程系列】SHAP特征重要性分析-逻辑回归模型为例
- 2025-01-18 python 简单几句搞定逻辑回归AI算法
- 2025-01-18 一文带您了解逻辑回归(Logistic Regression): Python示例
- 2025-01-18 膜拜!终于有人能把人工智能算法的“逻辑回归”讲得明明白白了
- 2025-01-18 Python类与对象:构建复杂逻辑的魔法
- 272℃Python短文,Python中的嵌套条件语句(六)
- 271℃python笔记:for循环嵌套。end=""的作用,图形打印
- 269℃PythonNet:实现Python与.Net代码相互调用!
- 264℃Python实现字符串小写转大写并写入文件
- 263℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 122℃原来2025是完美的平方年,一起探索六种平方的算吧
- 104℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 99℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python数据分析实战-dataframe分组提取每一组的首条记录
- 如何使用Python将多个excel文件数据快速汇总?
- 「Python数据分析」Pandas进阶,使用groupby分组聚合数据(二)
- 还在熬夜合并30个Excel 3个案例,带你用Python玩转Excel高阶操作
- python数据分析实战:pandas分组聚合-自定义聚合函数
- Python 知识点 #31 - 分组和聚(python分层聚类)
- 人生苦短,自学 python——pandas 的分组操作
- 利用Python进行数据分组/数据透视表
- 超实用!用Python快速实现数据分组统计与透视表
- Python 之 Pandas:数据分组聚合统计的魔法秘籍
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)