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

来看看这个 Python 基础题你会么?谁能帮我解释一下,真心没明白

  •  
  •   altboy · 2017-08-02 19:19:17 +08:00 · 3397 次点击
    这是一个创建于 2700 天前的主题,其中的信息可能已经有所发展或是发生改变。

    print(1<(2==2)) #False print(1<2 ==2) #True

    18 条回复    2017-08-03 08:42:18 +08:00
    wellsc
        1
    wellsc  
       2017-08-02 19:27:10 +08:00 via Android
    建议了解一下运算符优先级
    BBrother
        2
    BBrother  
       2017-08-02 19:28:49 +08:00
    python 里 0 == False, 1 == True.
    lxml
        3
    lxml  
       2017-08-02 19:29:45 +08:00
    括号优先计算
    >>> 2==2
    0
    >>> 1<0
    False
    lxml
        4
    lxml  
       2017-08-02 19:30:26 +08:00
    @lxml #3 更正,括号优先计算
    >>> 2==2
    1
    >>> 1<1
    False
    Patrick95
        5
    Patrick95  
       2017-08-02 19:30:39 +08:00
    是类型隐式转换的问题。

    Python 中,除了‘’、""、0、()、[]、{}、None 转 bool 类型为 False
    其他转换基本都为 True
    111111111111
        6
    111111111111  
       2017-08-02 19:31:48 +08:00 via Android   ❤️ 10
    第一个 ,首先 2==2 结果是 1,所以 1<1 是 False
    第二个,你先理解(1<2<3) is True, (4>2<3) is True
    可以理解成先比较 1<2,再比较 2==2,所以结果是 True
    iVeego
        7
    iVeego  
       2017-08-02 19:33:54 +08:00
    @lxml #4 print(1<2 ==2) 这句话,1<2 是 True,应该是 1,所以转换成 print(1==2),不是这样吗?
    llb123
        8
    llb123  
       2017-08-02 19:33:56 +08:00   ❤️ 1
    第二个类似于 1<2 and 2==2
    altboy
        9
    altboy  
    OP
       2017-08-02 19:35:19 +08:00
    @111111111111 感谢,懂了
    iVeego
        10
    iVeego  
       2017-08-02 19:35:21 +08:00
    @lxml #3 我看了
    @111111111111 #6 的解释,明白了。
    lonelinsky
        11
    lonelinsky  
       2017-08-02 19:36:18 +08:00
    1. 1<(2==2)
    先算 2==2 为 True, 计算 1 < True 时,True 被转为数字类型,值为 1,1 < 1,为 False

    2. 1<2 ==2
    先算 1 < 2 为 True, 计算 True == 2 时,2 被转为 bool 类型,值为 True,True == True, 为 True

    注意比较的时候是把运算符右边的类型转为左边的类型,然后再行比较。
    ivechan
        12
    ivechan  
       2017-08-02 19:41:07 +08:00
    @lonelinsky 你这个解释是错的, True == 2,得出来的是 False.
    #6 的解释才是对的.
    不得不说这个问题确实很有趣..
    altboy
        13
    altboy  
    OP
       2017-08-02 19:41:38 +08:00
    @lonelinsky 这个解释我刚开始以为对了,往解释器里一放 True==2 然后就尴尬了。。。
    lonelinsky
        14
    lonelinsky  
       2017-08-02 19:46:50 +08:00
    @lonelinsky #11 更正,上面的说法是错误的,1 < 2 == 2 和 (1 < 2) == 2 是不一样的, 这个应该其实是 Python 的一个语法糖,为了简化 (b > a and b < c) , 可以直接写做 ( a < b < c); 所以题目的 1 < 2 == 2 其实就是 (1 < 2 and 2 == 2)
    =。=
    lonelinsky
        15
    lonelinsky  
       2017-08-02 19:48:50 +08:00
    @ivechan #12
    @altboy #13

    嗯,是我想当然了,实际上应该是我 14 刚才写的这样的 =。=
    ivechan
        16
    ivechan  
       2017-08-02 19:57:45 +08:00   ❤️ 2
    不得不说这个问题确实"装"到很多人, 看似简单的问题, 但是却被很多人用 C\Java 等语法套用在 Python 上弄得混淆了.
    为了弄清楚这个问题, 我去查了官方文档.
    里面有两句话解释了这个问题:
    "Also unlike C, expressions like a < b < c have the interpretation that is conventional in mathematics:"
    "Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z"
    简而言之, 在 Python 里, < > 这种比较运算符更倾向于数学的表达方式, 并且遵循"链式"的规则.

    举个例子, print(2<3>1)在 Python 是 True 的, 但是在 C 语言中却是"False"的.
    原因就是在数学中(Python 使用的), 这个不等式是成立的, 但是在 C 语言中, 并没有这种"数学"规则,
    C 语言中是这种顺序: 2<3 是 True 的, (或者更准确地说 2<3 返回的是一个非 0).但是在实现中, 一般是把 1 作为非 0 的替代,
    也就是 1 代表 True,0 代表 False. 这样整个逻辑比较就变成 1>1,也就是 False.

    PS: 感谢楼主和#6, 一个非常好的问题和一个明白人.
    zuanzi
        17
    zuanzi  
       2017-08-03 08:33:14 +08:00
    学到了
    altboy
        18
    altboy  
    OP
       2017-08-03 08:42:18 +08:00
    @ivechan 感谢,为老哥搞技术的这股韧劲点赞
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2786 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:58 · PVG 22:58 · LAX 06:58 · JFK 09:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.