1. <tfoot id='gHE43'></tfoot>

    <small id='gHE43'></small><noframes id='gHE43'>

  2. <legend id='gHE43'><style id='gHE43'><dir id='gHE43'><q id='gHE43'></q></dir></style></legend>
      <bdo id='gHE43'></bdo><ul id='gHE43'></ul>

      <i id='gHE43'><tr id='gHE43'><dt id='gHE43'><q id='gHE43'><span id='gHE43'><b id='gHE43'><form id='gHE43'><ins id='gHE43'></ins><ul id='gHE43'></ul><sub id='gHE43'></sub></form><legend id='gHE43'></legend><bdo id='gHE43'><pre id='gHE43'><center id='gHE43'></center></pre></bdo></b><th id='gHE43'></th></span></q></dt></tr></i><div id='gHE43'><tfoot id='gHE43'></tfoot><dl id='gHE43'><fieldset id='gHE43'></fieldset></dl></div>

      &quot;或&quot;运算符不返回bool的动机是什么?

      时间:2024-08-10

        <tfoot id='dkZTq'></tfoot>

        <legend id='dkZTq'><style id='dkZTq'><dir id='dkZTq'><q id='dkZTq'></q></dir></style></legend>
              <tbody id='dkZTq'></tbody>
              • <bdo id='dkZTq'></bdo><ul id='dkZTq'></ul>
                <i id='dkZTq'><tr id='dkZTq'><dt id='dkZTq'><q id='dkZTq'><span id='dkZTq'><b id='dkZTq'><form id='dkZTq'><ins id='dkZTq'></ins><ul id='dkZTq'></ul><sub id='dkZTq'></sub></form><legend id='dkZTq'></legend><bdo id='dkZTq'><pre id='dkZTq'><center id='dkZTq'></center></pre></bdo></b><th id='dkZTq'></th></span></q></dt></tr></i><div id='dkZTq'><tfoot id='dkZTq'></tfoot><dl id='dkZTq'><fieldset id='dkZTq'></fieldset></dl></div>

                <small id='dkZTq'></small><noframes id='dkZTq'>

              • 本文介绍了&quot;或&quot;运算符不返回bool的动机是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                首先,代码:

                >>> False or 'hello'
                'hello'
                

                这一令人惊讶的行为允许您检查x是否不是None,并在一行中检查x的值:

                >>> x = 10 if randint(0,2) == 1 else None
                >>> (x or 0) > 0
                # depend on x value...
                

                说明:or功能如this:

                如果x为False,则y,否则x

                据我所知,没有一种语言允许您这样做。那么,Python为什么要这么做呢?

                推荐答案

                听起来您好像是在将两个问题合并为一个问题。

                首先是短路的问题。Marcin的回答很好地解决了这个问题,所以我不会尝试做得更好。

                其次,orand返回上次求值的值,而不是将其转换为bool。双方都有争论,您可以在分歧的两边找到许多语言。

                返回上次求值的值允许使用functionCall(x) or defaultValue快捷方式,避免可能的浪费转换(如果您要用它做的唯一事情是检查它是否非零,为什么要将int2转换为bool1呢?),而且通常更容易解释。因此,由于这些原因的各种组合,C、Lisp、Javascript、Lua、Perl、Ruby和VB等语言都是这样做的,Python也是如此。

                始终从运算符返回布尔值有助于捕获一些错误(特别是在逻辑运算符和按位运算符容易混淆的语言中),并且它允许您设计一种语言,其中对true进行严格类型的布尔检查,而不仅仅是对非零进行检查,它使运算符的类型更易于写出,并且在两个操作数是不同类型的情况下避免处理转换(请参见C系列语言中的?:运算符)因此,由于这些原因的各种组合,像C++、Fortran、Smalltalk和Haskell这样的语言都是这样做的。


                在您的问题中(如果我理解正确的话),您使用此功能可以编写如下内容:

                if (x or 0) < 1:
                

                何时x很容易变成None。这个特定的用例不是很有用,这既是因为更明确的x if x else 0(在Python2.5和更高版本中)同样容易编写,也可能更容易理解(至少Guido是这样认为的),还因为None < 1无论如何都与0 < 1相同(至少在Python2.x中是这样,所以您始终至少有两个选项中的一个)…但也有类似的示例说明它有用的。比较这两项:

                return launchMissiles() or -1
                
                return launchMissiles() if launchMissiles() else -1
                

                第二个将浪费大量导弹炸毁您在南极洲的敌人两次而不是一次。


                如果您好奇Python为什么这样做:

                回到1.x天,没有bool类型。您有None0[]()""等错误的值,其他都是真的,那么谁还需要显式的FalseTrue呢?从or返回1是愚蠢的,因为1并不比[1, 2, 3]"dsfsdf"更正确。到添加bool时(逐渐超过两个2.x版本,IIRC),当前逻辑已经牢固地嵌入到语言中,更改会破坏很多代码。

                那么,他们为什么不在3.0中进行更改呢?许多Python用户,包括BDFL Guido,会建议您在这种情况下不应该使用or(至少因为它违反了"TOOWTDI");而应该将表达式的结果存储在变量中,例如:

                missiles = launchMissiles()
                return missiles if missiles else -1
                
                事实上,Guido已经声明他想禁止launchMissiles() or -1,这也是他最终接受了他之前多次拒绝的三元if-else表达式的部分原因。但其他许多人不同意,Guido是仁慈的DFL。此外,在这里让or按照您在其他地方期望的方式工作,同时拒绝做您想做的事情(但Guido不想让您做),实际上是相当复杂的。


                因此,Python在这里可能始终与C、Perl和Lisp站在同一阵线,而不是与Java、Smalltalk和Haskell站在同一阵线。

                这篇关于&quot;或&quot;运算符不返回bool的动机是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  <legend id='Yg7qP'><style id='Yg7qP'><dir id='Yg7qP'><q id='Yg7qP'></q></dir></style></legend>

                  <small id='Yg7qP'></small><noframes id='Yg7qP'>

                    <bdo id='Yg7qP'></bdo><ul id='Yg7qP'></ul>

                          <tbody id='Yg7qP'></tbody>
                      1. <i id='Yg7qP'><tr id='Yg7qP'><dt id='Yg7qP'><q id='Yg7qP'><span id='Yg7qP'><b id='Yg7qP'><form id='Yg7qP'><ins id='Yg7qP'></ins><ul id='Yg7qP'></ul><sub id='Yg7qP'></sub></form><legend id='Yg7qP'></legend><bdo id='Yg7qP'><pre id='Yg7qP'><center id='Yg7qP'></center></pre></bdo></b><th id='Yg7qP'></th></span></q></dt></tr></i><div id='Yg7qP'><tfoot id='Yg7qP'></tfoot><dl id='Yg7qP'><fieldset id='Yg7qP'></fieldset></dl></div>
                        <tfoot id='Yg7qP'></tfoot>