V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2016-05-20 20:14:09 +08:00 · 6785 次点击
    这是一个创建于 3141 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    我觉得坑是指明显的错误,比如 coding:utf-8 和 coding:utf8 的区别,
    不是指一些 Python 明确指出的特色,虽然也许有人觉得不合理。
    ayaseangle
        19
    ayaseangle  
       2016-05-21 16:37:26 +08:00
    这就是所谓的 pythonic 吗?
    Delbert
        20
    Delbert  
       2016-05-22 10:56:07 +08:00 via Android
    @ukauka python 并么有:?
    mulog
        21
    mulog  
       2016-05-23 15:29:44 +08:00
    这种用法比 val1 if intval > 1 else val2 也不少打几个字啊,何必呢。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 141ms · UTC 06:12 · PVG 14:12 · LAX 22:12 · JFK 01:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.