使用 Python 的 a and b or c 要注意的地方

2016-05-20 20:14:09 +08:00
 jamiesun

"a and b or c" 这是 Python 里经常用到的很方便的一个表达式,被用的很频繁。

intval > 1 and val1 or val2

如果 intval > 1 表达式为真返回 val1 否则返回 val2 ,但这只是其中一种逻辑。

(intval > 1 and val1) or val2

如上:如果 val1 是逻辑否,那么就会返回 val2 ,当你就是想返回一个逻辑否的值时,比如 (0,[],{},False,''),那么这个表达式就不能这么用了。

应该用:

val1 if intval > 1 else val2

前段时间系统莫名其妙出现一个 bug ,查找半天发现很早以前不注意埋下了这个坑,耽误好多时间。

6621 次点击
所在节点    Python
21 条回复
loading
2016-05-20 20:17:32 +08:00
像我这种菜鸟,我会写成多行……脑袋不行!
lxy
2016-05-20 20:32:21 +08:00
一直都用 if else 。
顺便也分享最近一个坑。
>>> False in [0, 1]
True
>>> False is 0
False
>>> False == 0
True
>>> all([0, 1])
False
Kilerd
2016-05-20 20:36:32 +08:00
像我这种菜鸟,我会打上括号......脑袋不行!
aias
2016-05-20 20:41:52 +08:00
像我这种菜鸟,我会少用 python … py 不行!
jhaohai
2016-05-20 20:43:55 +08:00
不用语法糖,不用缩写,省的以后别人甚至自己看不懂
ukauka
2016-05-20 20:50:33 +08:00
老老实实用?:不好吗
laoyur
2016-05-20 20:53:22 +08:00
@ukauka ……
jiang42
2016-05-20 20:53:41 +08:00
@ukauka 没有。

其实 one line if 挺好的,我从来不用 and or 的这种用法,也很少见人推荐
laoyur
2016-05-20 20:54:37 +08:00
像我这种菜鸟,根本就不知道楼主这种用法
我压根只会 xxx if yyy else zzz 这种,这还是想找 6 楼的替代用法时学会的
alexapollo
2016-05-20 20:56:33 +08:00
scala 还是比 python 好用的
qqmishi
2016-05-20 21:06:24 +08:00
吃语法糖一时爽,,,
eric6356
2016-05-20 21:11:23 +08:00
and or 一般用来把布尔值简单地映射成别的值吧。更复杂的逻辑要用 inline if 了。
xavierskip
2016-05-20 21:13:22 +08:00
> import this
imn1
2016-05-20 21:19:49 +08:00
我的笔记

三元式
1. a = b if 条件 else c
2. a = (c, b)[条件] # 注意 False 对应值在前面, b 和 c 也应事实存在
3. a = 条件 and b or c # 此用法有一定逻辑问题
wingyiu
2016-05-20 21:49:44 +08:00
and or 不是 && ||吗吗吗吗吗? 怎么会有人用来输出值?
latyas
2016-05-21 08:46:01 +08:00
人工合理混淆
jamiesun
2016-05-21 09:24:32 +08:00
@lxy 哈哈,你那个我也遇到过啊,把队友坑了一个通宵找 bug
WangYanjie
2016-05-21 12:29:38 +08:00
我觉得这不算坑吧,是写的人自己疏忽,你用 if 写的时候也是要写成这样 if interval > 1 才对?
@lxy is 比较地址, == 比较实际的值, False 其实是一个常量

我觉得坑是指明显的错误,比如 coding:utf-8 和 coding:utf8 的区别,
不是指一些 Python 明确指出的特色,虽然也许有人觉得不合理。
ayaseangle
2016-05-21 16:37:26 +08:00
这就是所谓的 pythonic 吗?
Delbert
2016-05-22 10:56:07 +08:00
@ukauka python 并么有:?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280122

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX