V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
jamiesun
V2EX  ›  Python

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

  •  1
     
  •   jamiesun ·
    jamiesun · May 20, 2016 · 7353 views
    This topic created in 3630 days ago, the information mentioned may be changed or developed.

    "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 ,查找半天发现很早以前不注意埋下了这个坑,耽误好多时间。

    21 replies    2016-05-23 15:29:44 +08:00
    loading
        1
    loading  
       May 20, 2016 via Android
    像我这种菜鸟,我会写成多行……脑袋不行!
    lxy
        2
    lxy  
       May 20, 2016   ❤️ 2
    一直都用 if else 。
    顺便也分享最近一个坑。
    >>> False in [0, 1]
    True
    >>> False is 0
    False
    >>> False == 0
    True
    >>> all([0, 1])
    False
    Kilerd
        3
    Kilerd  
       May 20, 2016
    像我这种菜鸟,我会打上括号......脑袋不行!
    aias
        4
    aias  
       May 20, 2016 via Android
    像我这种菜鸟,我会少用 python … py 不行!
    jhaohai
        5
    jhaohai  
       May 20, 2016 via iPhone
    不用语法糖,不用缩写,省的以后别人甚至自己看不懂
    ukauka
        6
    ukauka  
       May 20, 2016
    老老实实用?:不好吗
    laoyur
        7
    laoyur  
       May 20, 2016
    @ukauka ……
    jiang42
        8
    jiang42  
       May 20, 2016 via iPhone
    @ukauka 没有。

    其实 one line if 挺好的,我从来不用 and or 的这种用法,也很少见人推荐
    laoyur
        9
    laoyur  
       May 20, 2016
    像我这种菜鸟,根本就不知道楼主这种用法
    我压根只会 xxx if yyy else zzz 这种,这还是想找 6 楼的替代用法时学会的
    alexapollo
        10
    alexapollo  
       May 20, 2016
    scala 还是比 python 好用的
    qqmishi
        11
    qqmishi  
       May 20, 2016
    吃语法糖一时爽,,,
    eric6356
        12
    eric6356  
       May 20, 2016 via iPhone
    and or 一般用来把布尔值简单地映射成别的值吧。更复杂的逻辑要用 inline if 了。
    C0VN
        13
    C0VN  
       May 20, 2016
    > import this
    imn1
        14
    imn1  
       May 20, 2016
    我的笔记

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

    我觉得坑是指明显的错误,比如 coding:utf-8 和 coding:utf8 的区别,
    不是指一些 Python 明确指出的特色,虽然也许有人觉得不合理。
    ayaseangle
        19
    ayaseangle  
       May 21, 2016
    这就是所谓的 pythonic 吗?
    Delbert
        20
    Delbert  
       May 22, 2016 via Android
    @ukauka python 并么有:?
    mulog
        21
    mulog  
       May 23, 2016
    这种用法比 val1 if intval > 1 else val2 也不少打几个字啊,何必呢。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5604 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 140ms · UTC 07:13 · PVG 15:13 · LAX 00:13 · JFK 03:13
    ♥ Do have faith in what you're doing.