多个数据获取第一个非空值

2021-03-13 11:53:19 +08:00
 xiaoqiao24

有一个需求,获取 value1, value2, value3, value4 中第一个有数据的值(可以被 if 判断为 True),代码如下

a = None
if value1:
    a = value1
if value2 and a is None:
    a = value2
if value3 and a is None:
    a = value3
if value4 and a is None:
    a = value4

可以看到上面的代码亢长 我就想到了如下写法

a = value1 or value2 or value3 or value4

一行代码搞定

不知各位对上面两种写法的有什么看法呢?希望大家不吝赐教。

2144 次点击
所在节点    Python
16 条回复
pkookp8
2021-03-13 11:56:15 +08:00
上面的为什么不写成 if...else if...else if...
0ZXYDDu796nVCFxq
2021-03-13 11:59:28 +08:00
1. 第一种有效率问题
获取到第一个有数据的值后,后面的 if 仍然会运行
应该用 if elif

2. “有数据”定义不清晰
0, '', False, [], {}
这些算“有数据”吗
以上数值的 if value1 结果都是 False
msg7086
2021-03-13 12:14:08 +08:00
第二种无法区分假值和空值。
不考虑区分空值的情况下直接 或 就行了。
需要区分空值的情况用第一种。
est
2021-03-13 12:16:19 +08:00
filter(None, [v1, v2, ...]) 取第一个就行
ericls
2021-03-13 12:29:15 +08:00
next(iterable) 就行
ericls
2021-03-13 12:30:19 +08:00
next(i for i in (v1, v2, v3, ...) if i) 就行
ericls
2021-03-13 12:32:18 +08:00
如果你还想再 hacky 一点
next(i for i in (v for k, v in locals().items() if k.startswith('value')) if i)

可能会挨打
WubbaLubba
2021-03-13 14:14:35 +08:00
next((x for x in (value1, value2, value3, value4) if x is not None), None)
xarthur
2021-03-13 15:20:10 +08:00
filter 过滤一下就行了……
TanMusong
2021-03-13 15:28:34 +08:00
有数据的值(可以被 if 判断为 True)
TanMusong
2021-03-13 15:28:44 +08:00
可以被 if 判断为 True
TanMusong
2021-03-13 15:28:54 +08:00
if 判断为 True
TanMusong
2021-03-13 15:29:01 +08:00
if 为 True
xiaoqiao24
2021-03-13 22:33:40 +08:00
@TanMusong 意思是
if value 可以进入 if 判断
dengshen
2021-03-14 14:46:34 +08:00
find 返回 null 或者第一个符合条件的对象
TanMusong
2021-03-16 09:46:25 +08:00
@xiaoqiao24 所以上边为啥会有 [“有数据”定义不清晰] , [无法区分假值和空值] 哈哈

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

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

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

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

© 2021 V2EX