推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
xiaoqiao24
V2EX  ›  Python

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

  •  
  •   xiaoqiao24 · Mar 13, 2021 · 3396 views
    This topic created in 2062 days ago, the information mentioned may be changed or developed.

    有一个需求,获取 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
    

    一行代码搞定

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

    16 replies  •  2021-03-16 09:46:25 +08:00
    pkookp8
    pkookp8
    Mar 13, 2021 via Android
    1
    上面的为什么不写成 if...else if...else if...
    0ZXYDDu796nVCFxq
    0ZXYDDu796nVCFxq
    Mar 13, 2021
    2
    1. 第一种有效率问题
    获取到第一个有数据的值后,后面的 if 仍然会运行
    应该用 if elif

    2. “有数据”定义不清晰
    0, '', False, [], {}
    这些算“有数据”吗
    以上数值的 if value1 结果都是 False
    msg7086
    msg7086
    Mar 13, 2021
    3
    第二种无法区分假值和空值。
    不考虑区分空值的情况下直接 或 就行了。
    需要区分空值的情况用第一种。
    est
    est
    Mar 13, 2021 via Android
    4
    filter(None, [v1, v2, ...]) 取第一个就行
    ericls
    ericls
    Mar 13, 2021 via iPhone
    5
    next(iterable) 就行
    ericls
    ericls
    Mar 13, 2021❤️1
    6
    next(i for i in (v1, v2, v3, ...) if i) 就行
    ericls
    ericls
    Mar 13, 2021
    7
    如果你还想再 hacky 一点
    next(i for i in (v for k, v in locals().items() if k.startswith('value')) if i)

    可能会挨打
    WubbaLubba
    WubbaLubba
    Mar 13, 2021
    8
    next((x for x in (value1, value2, value3, value4) if x is not None), None)
    xarthur
    xarthur
    Mar 13, 2021 via iPhone
    9
    filter 过滤一下就行了……
    TanMusong
    TanMusong
    Mar 13, 2021
    10
    有数据的值(可以被 if 判断为 True)
    TanMusong
    TanMusong
    Mar 13, 2021
    11
    可以被 if 判断为 True
    TanMusong
    TanMusong
    Mar 13, 2021
    12
    if 判断为 True
    TanMusong
    TanMusong
    Mar 13, 2021
    13
    if 为 True
    xiaoqiao24
    xiaoqiao24
    OP
    Mar 13, 2021
    14
    @TanMusong 意思是
    if value 可以进入 if 判断
    dengshen
    dengshen
    Mar 14, 2021 via iPhone
    15
    find 返回 null 或者第一个符合条件的对象
    TanMusong
    TanMusong
    Mar 16, 2021
    16
    @xiaoqiao24 所以上边为啥会有 [“有数据”定义不清晰] , [无法区分假值和空值] 哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2929 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 11:25 · PVG 19:25 · LAX 03:25 · JFK 06:25
    ♥ Do have faith in what you're doing.