首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
Coding
V2EX  ›  Python

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

  •  
  •   vexplain · 334 天前 · 6127 次点击
    这是一个创建于 334 天前的主题,其中的信息可能已经有所发展或是发生改变。
    刚刚,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 条附言  ·  334 天前
    54 回复  |  直到 2019-01-17 09:32:33 +08:00
        1
    glacer   334 天前
    这样写如果是 -1<0<1 那就应该是 false 了吧
        2
    KevinBu   334 天前
    Pycharm 的提示功能很强大😄
        3
    hangvane   334 天前 via iPhone
    @glacer 编译器提示可以简化了那应该就是和数学意义一样吧

    测试了下
    print(-3<-2<-1)
    print(2<3<4)
    均为 True,无论假设是左结合还是右结合都是正确的
        4
    AvenirX   334 天前
    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 会被理解为数学公式写法的意思.
        5
    aborigine   334 天前
    @glacer #1 试了下是 true
        6
    aijam   334 天前
    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
        7
    013231   334 天前
    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.
        8
    jmc891205   334 天前
    额 很常写啊 很好用的语法糖
        9
    loading   334 天前 via Android   ♥ 4
    不会,我只会写那种傻子都能看懂的,因为我过几天看我的代码就想看智障的一样。
        10
    sikariba   334 天前
    我也常写
        11
    bikingtarzan   334 天前
    不会,就用普通的格式,不然之后看代码,就在这里卡一下 , = =
        12
    goodryb   334 天前
    为啥不好好写成 a < b and b < c,代码不是约简单越好吗,除非性能上有很大差距
        13
    lithiumii   334 天前
    @goodryb 对普通人来说,难道不是连起来写更简单吗? a < b and b < c 只是对别的语言的程序写多了的人来说简单吧。
        14
    zhy   334 天前
    前两天刚遇到这种提示,当然这种方式更直观
        15
    vexplain   334 天前
    @013231 #7 大佬指点的是, 怎么就没去查下文档呢。
        16
    BBCCBB   334 天前
    python 里是可以直接写成 a<b<c 这种形式的, 楼上也说了, 和 a<b and b<c 一样的
        17
    vexplain   334 天前
    @jmc891205 #8 以前写 java 不能这么写,现在知道了
        18
    xieranmaya   334 天前 via Android
    这明明是 python 的标准语法,这个语法给我的映像也很深
    不过如果是我,我不会写,我怕把这习惯带到其它语言里面去了
        19
    vexplain   334 天前
    @BBCCBB #16 嗯嗯,a < b < c 更容易理解。
        21
    pimin   334 天前
    我写的话肯定会写 a<b&&b<c
        22
    busfool   334 天前 via Android
    可以 可以这样写
        23
    chengxiao   334 天前
    不会 我想将来回来看的时候回产生一些不必要的误解
    最近经常几个语言来回混写 有些语法在另一个语言中就成另一种意思了 搞着搞着就发现尽量语义化的必要性了
        24
    youthfire   334 天前 via iPhone
    我很在意 pycharm 的啰嗦,会修改到他满意,强迫症…
        25
    imn1   334 天前
    经常
    还经常写 a=b=c=0 这种赋值

    以前研究为何 python 没有 between()函数时,就知道 min<v<max 这种写法了
        26
    richzhu   334 天前
    😂我是菜逼。。。一直都这么写...

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

    yes or no ?
        31
    magicO   334 天前
    @edigar 崩了。。。
        32
    sazima   334 天前
    print(1<2<3<4<5>2 ) ?
        33
    magicO   334 天前
    @edigar 我自己的 pycharm 出了问题==是 No, 话说文件名不能写成 abc !真是优秀
        34
    cissoid   334 天前
    @magicO #33

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

    文件名不能写成 abc 可能是因为和标准库重名了
        35
    xpresslink   334 天前
    @SeaRecluse 别扯了,a < b < c 只是 a < b and b < c 的语法糖
        36
    magicO   334 天前
    @cissoid 对的
        37
    SeaRecluse   334 天前
    @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
        38
    SeaRecluse   334 天前
    @xpresslink 因为 a<b,b< c 所以 a< b <c,你数学老师没教过你这样推论的前提条件吗
        39
    xxgirl2   334 天前
    写 C 写多了这种有点特别的东西不太敢碰。能看懂是首要的,语法用得傻白甜也无妨。
        40
    UnitTest   334 天前
    @SeaRecluse 这个还有前提条件?
        41
    SeaRecluse   334 天前
    @UnitTest 动态语言带来的弊端,a,b,c 相互比较的属性不一定等价
        42
    bestkayle   334 天前 via iPhone
    py 写完基本要修个几百遍才行
        43
    xpresslink   334 天前   ♥ 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.
        44
    xi2008wang   334 天前
    >>> 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 列表
        45
    ytmsdy   334 天前
    花式语法还是算了吧。过几个月以后,你自己回去看,都看不懂
        46
    lshang   333 天前   ♥ 1
    经常用,写 Python 不写 Pythonic 的代码岂不是太无趣了
        47
    Xs0ul   333 天前
    @SeaRecluse #37 你说的这个性质叫传递性

    如果没有传递性,a<b<c 这个式子本身的意义就是模糊的
        48
    RangerWolf   333 天前
    也是最近发发现有 a<b<c 这种写法。。。
    也同样是 Java 转过来的。。。

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

    (a<b)<c 才是 c 语言的意思
        53
    wawehi   333 天前
    其实这样写可读性是不错的,最怕 lambada + filter + map 这种的,一头雾水,得看很久才明白怎么回事
        54
    jkhere   332 天前
    生产代码还是少用一些语法糖之类的,代码简单易懂最重要。过一段时间即使自己看自己的代码都会懵逼,更别说给别人看和修改了。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2408 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 12:42 · PVG 20:42 · LAX 04:42 · JFK 07:42
    ♥ Do have faith in what you're doing.