有一个需求,获取 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
一行代码搞定
不知各位对上面两种写法的有什么看法呢?希望大家不吝赐教。
1
pkookp8 2021-03-13 11:56:15 +08:00 via Android
上面的为什么不写成 if...else if...else if...
|
2
0ZXYDDu796nVCFxq 2021-03-13 11:59:28 +08:00
1. 第一种有效率问题
获取到第一个有数据的值后,后面的 if 仍然会运行 应该用 if elif 2. “有数据”定义不清晰 0, '', False, [], {} 这些算“有数据”吗 以上数值的 if value1 结果都是 False |
3
msg7086 2021-03-13 12:14:08 +08:00
第二种无法区分假值和空值。
不考虑区分空值的情况下直接 或 就行了。 需要区分空值的情况用第一种。 |
4
est 2021-03-13 12:16:19 +08:00 via Android
filter(None, [v1, v2, ...]) 取第一个就行
|
5
ericls 2021-03-13 12:29:15 +08:00 via iPhone
next(iterable) 就行
|
6
ericls 2021-03-13 12:30:19 +08:00 1
next(i for i in (v1, v2, v3, ...) if i) 就行
|
7
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) 可能会挨打 |
8
WubbaLubba 2021-03-13 14:14:35 +08:00
next((x for x in (value1, value2, value3, value4) if x is not None), None)
|
9
xarthur 2021-03-13 15:20:10 +08:00 via iPhone
filter 过滤一下就行了……
|
10
TanMusong 2021-03-13 15:28:34 +08:00
有数据的值(可以被 if 判断为 True)
|
11
TanMusong 2021-03-13 15:28:44 +08:00
可以被 if 判断为 True
|
12
TanMusong 2021-03-13 15:28:54 +08:00
if 判断为 True
|
13
TanMusong 2021-03-13 15:29:01 +08:00
if 为 True
|
14
xiaoqiao24 OP @TanMusong 意思是
if value 可以进入 if 判断 |
15
dengshen 2021-03-14 14:46:34 +08:00 via iPhone
find 返回 null 或者第一个符合条件的对象
|
16
TanMusong 2021-03-16 09:46:25 +08:00
@xiaoqiao24 所以上边为啥会有 [“有数据”定义不清晰] , [无法区分假值和空值] 哈哈
|