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
fuxkcsdn
V2EX  ›  Python

Python 三目运算, 2 种表达方式返回结果为什么不一样?

  •  
  •   fuxkcsdn · 2017-06-30 00:30:08 +08:00 · 3807 次点击
    这是一个创建于 2464 天前的主题,其中的信息可能已经有所发展或是发生改变。

    python 萌新(学了 3 个月左右还算吗)

    一直用 condition and true or false 这个三目运算表达式(因为比 true if condition else false 少一个字符...) 今天码程序的时候发现用前一种表达式得到的结果非预期

    Python 3.4.2 和 2.7.9 测试过都一样

    from dogpile.cache import make_region
    from dogpile.cache.api import NoValue
    
    cache = make_region().configure(
        'dogpile.cache.dbm', arguments={'filename': '/tmp/cache.dbm'})
                                                         
    session = cache.get('NO_EXISTS_KEY')                 
                                                         
    print(isinstance(session, NoValue) and None or session)
    print(None if isinstance(session, NoValue) else session)
    
    # Output <dogpile.cache.api.NoValue object at 0x107611c10>
    # Output None
    
    第 1 条附言  ·  2017-06-30 08:41:19 +08:00
    昨晚睡觉前尝试将第一种表达式中的 None 换成 1,发现是预期值后才意识到我错把
    condition and true or false 理解为 C 中的 condition ? true : false 了
    正确的应该是
    condition and true or false 等价于 js 中的 condition && true || false
    虽然从字面理解就应该是这样…但之前一直以为这写法是 python 三目运算的另一种表达式…
    16 条回复    2017-06-30 09:28:05 +08:00
    for4
        1
    for4  
       2017-06-30 00:37:04 +08:00
    isinstance(session, NoValue) and None or session

    ( isinstance(session, NoValue) and None ) === None

    None or session => session
    zjuhwc
        2
    zjuhwc  
       2017-06-30 00:42:17 +08:00 via iPhone
    你都写了
    condition and true or false,
    你的用法里第二个是 None,并不是一个 true。
    关键是理解 python 里的真值有哪些,and or 只是利用了逻辑短路特性模拟的三目运算符,可读性不好,推荐还是用 if else 的写法
    Xs0ul
        3
    Xs0ul  
       2017-06-30 00:44:13 +08:00
    以我的理解,condition and true or false 只是按照 python 语法写出的一个普通表达式。

    isinstance(session, NoValue): True
    True and None: None
    None or session: session

    所以 print 出了 session

    第二个是 None。这两个写法并不是等价的。
    binux
        4
    binux  
       2017-06-30 01:31:16 +08:00
    不要用 and or 当三目运算符
    skydiver
        5
    skydiver  
       2017-06-30 02:07:38 +08:00 via Android
    因为本来就不等价
    NoAnyLove
        6
    NoAnyLove  
       2017-06-30 03:31:30 +08:00
    不要乱用`cond and or`,这是官方不推荐的用法。用`A if cond else B`
    wwqgtxx
        7
    wwqgtxx  
       2017-06-30 06:54:55 +08:00 via iPhone
    谁说过 and or 是三目运算符了
    bfbd
        8
    bfbd  
       2017-06-30 07:32:03 +08:00
    换一下顺序,把 None 放在最后。 (not isinstance(session, NoValue)) and session or None,
    CYKun
        9
    CYKun  
       2017-06-30 08:48:17 +08:00 via Android
    condition and ret,你这是 javascript 的习惯写法吧,python 里没怎么见过这么写的。

    第一次见到这种写法的时候懵逼了半天,不得不承认 js 程序员脑洞清奇。
    lrh3321
        10
    lrh3321  
       2017-06-30 08:52:23 +08:00
    "谁说过 and or 是三目运算符了" +1
    ipwx
        11
    ipwx  
       2017-06-30 08:52:24 +08:00
    A and B <=> B if A else A
    A or B <=> A if A else B
    Lycnir
        12
    Lycnir  
       2017-06-30 08:53:00 +08:00
    如果不能明确返回,就像 1 楼老实的是括号
    NaVient
        14
    NaVient  
       2017-06-30 09:22:46 +08:00
    你应该需要的是 a if True else b
    minvacai
        15
    minvacai  
       2017-06-30 09:25:16 +08:00 via Android
    我想问既然是 javascript 为什么不用 condition ? a : b
    cxyfreedom
        16
    cxyfreedom  
       2017-06-30 09:28:05 +08:00 via iPhone
    第一种基本就没写过
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2837 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:22 · PVG 21:22 · LAX 06:22 · JFK 09:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.