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

你们 Python 会写: if a < b < c :么?

  •  
  •   vexplain · 2019-01-15 11:59:35 +08:00 · 9415 次点击
    这是一个创建于 1920 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚刚,Pycharm 中写了: if min < num and num < max:
    结果提示:
    Simplify chained comparison
    This inspection highlights chained comparisons that can be simplified.

    就很纳闷, 随机自己手动 ipython 中试了下 1<2<3 结果是 True.
    True < 3 也是 True
    应该是跟平常一样 True 和 False 分别当做 1,0 处理了吧。
    但是平常没有这么写过, 你们会这么写么?
    第 1 条附言  ·  2019-01-15 13:12:34 +08:00
    54 条回复    2019-01-17 09:32:33 +08:00
    glacer
        1
    glacer  
       2019-01-15 12:00:58 +08:00
    这样写如果是 -1<0<1 那就应该是 false 了吧
    KevinBu
        2
    KevinBu  
       2019-01-15 12:01:24 +08:00
    Pycharm 的提示功能很强大😄
    hangvane
        3
    hangvane  
       2019-01-15 12:17:10 +08:00 via iPhone
    @glacer 编译器提示可以简化了那应该就是和数学意义一样吧

    测试了下
    print(-3<-2<-1)
    print(2<3<4)
    均为 True,无论假设是左结合还是右结合都是正确的
    AvenirX
        4
    AvenirX  
       2019-01-15 12:20:43 +08:00
    a<b<c 在 python 等同于 a<b and b<c, 而不是 (a<b)<c.
    看: https://docs.python.org/3/reference/expressions.html#comparisons

    Also unlike C, expressions like a < b < c have the interpretation that is conventional in mathematics.
    不同于 C 语言, a<b<c 会被理解为数学公式写法的意思.
    aborigine
        5
    aborigine  
       2019-01-15 12:20:53 +08:00
    @glacer #1 试了下是 true
    aijam
        6
    aijam  
       2019-01-15 12:20:58 +08:00
    Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z
    https://docs.python.org/3.7/reference/expressions.html#comparisons
    013231
        7
    013231  
       2019-01-15 12:22:31 +08:00
    https://docs.python.org/3/reference/expressions.html#comparisons

    為什麼不讀文檔呢?

    Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false).

    Formally, if a, b, c, …, y, z are expressions and op1, op2, …, opN are comparison operators, then a op1 b op2 c ... y opN z is equivalent to a op1 b and b op2 c and ... y opN z, except that each expression is evaluated at most once.
    jmc891205
        8
    jmc891205  
       2019-01-15 12:24:32 +08:00
    额 很常写啊 很好用的语法糖
    loading
        9
    loading  
       2019-01-15 12:26:11 +08:00 via Android   ❤️ 4
    不会,我只会写那种傻子都能看懂的,因为我过几天看我的代码就想看智障的一样。
    sikariba
        10
    sikariba  
       2019-01-15 12:32:48 +08:00
    我也常写
    bikingtarzan
        11
    bikingtarzan  
       2019-01-15 12:38:23 +08:00
    不会,就用普通的格式,不然之后看代码,就在这里卡一下 , = =
    goodryb
        12
    goodryb  
       2019-01-15 12:42:42 +08:00
    为啥不好好写成 a < b and b < c,代码不是约简单越好吗,除非性能上有很大差距
    lithiumii
        13
    lithiumii  
       2019-01-15 12:52:04 +08:00
    @goodryb 对普通人来说,难道不是连起来写更简单吗? a < b and b < c 只是对别的语言的程序写多了的人来说简单吧。
    zhy
        14
    zhy  
       2019-01-15 12:55:52 +08:00
    前两天刚遇到这种提示,当然这种方式更直观
    vexplain
        15
    vexplain  
    OP
       2019-01-15 12:56:09 +08:00
    @013231 #7 大佬指点的是, 怎么就没去查下文档呢。
    BBCCBB
        16
    BBCCBB  
       2019-01-15 12:56:55 +08:00
    python 里是可以直接写成 a<b<c 这种形式的, 楼上也说了, 和 a<b and b<c 一样的
    vexplain
        17
    vexplain  
    OP
       2019-01-15 13:00:57 +08:00
    @jmc891205 #8 以前写 java 不能这么写,现在知道了
    xieranmaya
        18
    xieranmaya  
       2019-01-15 13:01:55 +08:00 via Android
    这明明是 python 的标准语法,这个语法给我的映像也很深
    不过如果是我,我不会写,我怕把这习惯带到其它语言里面去了
    vexplain
        19
    vexplain  
    OP
       2019-01-15 13:02:43 +08:00
    @BBCCBB #16 嗯嗯,a < b < c 更容易理解。
    vexplain
        20
    vexplain  
    OP
       2019-01-15 13:04:31 +08:00
    pimin
        21
    pimin  
       2019-01-15 13:26:09 +08:00
    我写的话肯定会写 a<b&&b<c
    busfool
        22
    busfool  
       2019-01-15 13:36:56 +08:00 via Android
    可以 可以这样写
    chengxiao
        23
    chengxiao  
       2019-01-15 13:38:05 +08:00
    不会 我想将来回来看的时候回产生一些不必要的误解
    最近经常几个语言来回混写 有些语法在另一个语言中就成另一种意思了 搞着搞着就发现尽量语义化的必要性了
    youthfire
        24
    youthfire  
       2019-01-15 13:43:46 +08:00 via iPhone
    我很在意 pycharm 的啰嗦,会修改到他满意,强迫症…
    imn1
        25
    imn1  
       2019-01-15 13:46:13 +08:00
    经常
    还经常写 a=b=c=0 这种赋值

    以前研究为何 python 没有 between()函数时,就知道 min<v<max 这种写法了
    richzhu
        26
    richzhu  
       2019-01-15 13:56:20 +08:00
    😂我是菜逼。。。一直都这么写...

    if a >> b > c:
    pass:
    else:
    pass
    SeaRecluse
        27
    SeaRecluse  
       2019-01-15 14:18:40 +08:00
    a < b and b < c 与 a < b < c 并不完全等价吧,可能有潜在风险,但是如果只是大小判断的话似乎没什么问题,但是我还是选择第一种写法
    baicheng10
        28
    baicheng10  
       2019-01-15 14:44:04 +08:00
    @lithiumii 之前有人在群里问过同样的问题,一群人理解的都是类似 a < (b < c) => a < true => true。没人发现其实是初中就会的自然语言的逻辑。 可能没学过计算机语言的人更好理解一些,有语言基础的反而容易被误导吧。哈哈
    rust
        29
    rust  
       2019-01-15 14:44:41 +08:00
    @SeaRecluse 求解有哪些潜在风险
    edigar
        30
    edigar  
       2019-01-15 15:13:25 +08:00
    那么问题来了
    if 1 < 2 is True:
    print('Yes!')
    else:
    print('No!')

    yes or no ?
    magicO
        31
    magicO  
       2019-01-15 15:30:03 +08:00
    @edigar 崩了。。。
    sazima
        32
    sazima  
       2019-01-15 15:34:11 +08:00
    print(1<2<3<4<5>2 ) ?
    magicO
        33
    magicO  
       2019-01-15 15:34:14 +08:00
    @edigar 我自己的 pycharm 出了问题==是 No, 话说文件名不能写成 abc !真是优秀
    cissoid
        34
    cissoid  
       2019-01-15 15:55:20 +08:00
    @magicO #33

    if 1 < 2 is True 等于 if 1 < 2 and 2 is True

    文件名不能写成 abc 可能是因为和标准库重名了
    xpresslink
        35
    xpresslink  
       2019-01-15 16:06:47 +08:00
    @SeaRecluse 别扯了,a < b < c 只是 a < b and b < c 的语法糖
    magicO
        36
    magicO  
       2019-01-15 16:54:50 +08:00
    @cissoid 对的
    SeaRecluse
        37
    SeaRecluse  
       2019-01-15 17:28:49 +08:00
    @rust 任何一个比较都是限定在一个参考系或者标准下的,所以 a<b,b<c 推出 a<b<c 的前提的他们各自处于同一标准环境下且不相互影响。一个简单的例子,def funtion tmp(class A,class B) ,对于 AB 的交集属性,如果 A 均小 B,则 A < B True,反之 False 给出以下:

    A{
    x = 1
    y = 2
    z = 3
    };

    B{
    x = 2
    y = 3
    };

    C{
    x = 3
    y = 4
    z = 1
    }
    tmp(A,B) 得出 A < B True
    tmp(B,C) 得出 B < C True
    tmp(A,C) 得出 A < C False

    A < B and B < C True
    A < B < C False
    SeaRecluse
        38
    SeaRecluse  
       2019-01-15 17:29:55 +08:00
    @xpresslink 因为 a<b,b< c 所以 a< b <c,你数学老师没教过你这样推论的前提条件吗
    xxgirl2
        39
    xxgirl2  
       2019-01-15 18:12:59 +08:00
    写 C 写多了这种有点特别的东西不太敢碰。能看懂是首要的,语法用得傻白甜也无妨。
    UnitTest
        40
    UnitTest  
       2019-01-15 18:15:49 +08:00
    @SeaRecluse 这个还有前提条件?
    SeaRecluse
        41
    SeaRecluse  
       2019-01-15 18:28:59 +08:00
    @UnitTest 动态语言带来的弊端,a,b,c 相互比较的属性不一定等价
    bestkayle
        42
    bestkayle  
       2019-01-15 18:43:37 +08:00 via iPhone
    py 写完基本要修个几百遍才行
    xpresslink
        43
    xpresslink  
       2019-01-15 19:09:34 +08:00   ❤️ 2
    @SeaRecluse
    talk is cheap, show me the python code, for any case, a < b and b < c is True, but a < b <c is False.
    don't use operator overloading.
    xi2008wang
        44
    xi2008wang  
       2019-01-15 19:14:14 +08:00
    >>> import ast
    >>> ast.dump(ast.parse('-1 < 0'))
    'Module(body=[Expr(value=Compare(left=Num(n=-1), ops=[Lt()], comparators=[Num(n=0)]))])'
    >>> ast.dump(ast.parse('-1 < 0 < 1'))
    'Module(body=[Expr(value=Compare(left=Num(n=-1), ops=[Lt(), Lt()], comparators=[Num(n=0), Num(n=1)]))])'

    看来 python 对于 链式比较 Compare 维护了 ops 列表,comparatorszhi 列表
    ytmsdy
        45
    ytmsdy  
       2019-01-15 20:27:22 +08:00
    花式语法还是算了吧。过几个月以后,你自己回去看,都看不懂
    lshang
        46
    lshang  
       2019-01-16 02:03:33 +08:00   ❤️ 1
    经常用,写 Python 不写 Pythonic 的代码岂不是太无趣了
    Xs0ul
        47
    Xs0ul  
       2019-01-16 04:16:11 +08:00
    @SeaRecluse #37 你说的这个性质叫传递性

    如果没有传递性,a<b<c 这个式子本身的意义就是模糊的
    RangerWolf
        48
    RangerWolf  
       2019-01-16 09:01:05 +08:00
    也是最近发发现有 a<b<c 这种写法。。。
    也同样是 Java 转过来的。。。

    但是感觉依然不会连写吧。。。
    vipppppp
        49
    vipppppp  
       2019-01-16 09:34:56 +08:00
    看了一下上面的评论
    排除从 pycharm 等 ide 复制过来的,
    能写出 a < b < c 的朋友基本是知道这个的含义,而不明白的大部分都是写 a<b<c
    学一门语言怎么样都读一下文档吧。。随意就吐槽很奇怪。。
    xpresslink
        50
    xpresslink  
       2019-01-16 09:45:05 +08:00
    @Xs0ul 这个式子和传递性屁关系没有,只是纯粹的语法糖,解释器直接转换成 a < b and b < c, 并且不保证 a < c, 这此官方文档上写得清清楚楚的。程序语言只是借用数学符号,表达式并不能和数学公式定理等价。有些人不懂装懂非要把简单明确的事搞复杂了。
    Xs0ul
        51
    Xs0ul  
       2019-01-16 10:28:38 +08:00
    @xpresslink #50 那你也得看我回复的是谁
    hjq98765
        52
    hjq98765  
       2019-01-16 10:40:20 +08:00
    我都是 a<b<c 这么写

    (a<b)<c 才是 c 语言的意思
    wawehi
        53
    wawehi  
       2019-01-16 11:53:07 +08:00
    其实这样写可读性是不错的,最怕 lambada + filter + map 这种的,一头雾水,得看很久才明白怎么回事
    jkhere
        54
    jkhere  
       2019-01-17 09:32:33 +08:00
    生产代码还是少用一些语法糖之类的,代码简单易懂最重要。过一段时间即使自己看自己的代码都会懵逼,更别说给别人看和修改了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5571 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 02:53 · PVG 10:53 · LAX 19:53 · JFK 22:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.