推荐学习书目
› 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 · 7900 views
    This topic created in 3821 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
    loading
    May 20, 2016 via Android
    1
    像我这种菜鸟,我会写成多行……脑袋不行!
    lxy
    lxy
    May 20, 2016❤️2
    2
    一直都用 if else 。
    顺便也分享最近一个坑。
    >>> False in [0, 1]
    True
    >>> False is 0
    False
    >>> False == 0
    True
    >>> all([0, 1])
    False
    Kilerd
    Kilerd
    May 20, 2016
    3
    像我这种菜鸟,我会打上括号......脑袋不行!
    aias
    aias
    May 20, 2016 via Android
    4
    像我这种菜鸟,我会少用 python … py 不行!
    jhaohai
    jhaohai
    May 20, 2016 via iPhone
    5
    不用语法糖,不用缩写,省的以后别人甚至自己看不懂
    ukauka
    ukauka
    May 20, 2016
    6
    老老实实用?:不好吗
    laoyur
    laoyur
    May 20, 2016
    7
    @ukauka ……
    jiang42
    jiang42
    May 20, 2016 via iPhone
    8
    @ukauka 没有。

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

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

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