Python可以“和”返回None吗?

时间:2019-01-09 10:53:56

标签: python python-3.x

我正在查看一些似乎可以运行的代码,因为没有人抱怨它,但是对他们编写的内容感到很困惑:

if a and b is not None:
    # do something

我一直认为'and'运算符是返回True或False的东西,现在我开始怀疑自己..它还会返回什么,一个数字..它可能不是pythonic,但我是否缺少某些东西-有人怎么写这样的东西?

5 个答案:

答案 0 :(得分:5)

这表示a is Truthyb is not None是不是a and b is Truthy的含义,而是a = 999 b = None if a and b is not None: print("a is True but b is None") else: print("a is True and b is not None")

      public override void OnConnectionStateChange(BluetoothGatt gatt, [GeneratedEnum] GattStatus status, [GeneratedEnum] ProfileState newState)
      {
                base.OnConnectionStateChange(gatt, status, newState);

                if(newState == ProfileState.Connected)
   }

答案 1 :(得分:2)

上面的代码表示:

如果a(是对的)且AND b不是None,则#do something

答案 2 :(得分:2)

根据[Python 3]: Operator precedence强调是我的):

  

下表总结了Python中的运算符优先级,从最低优先级(最低绑定)到最高优先级(大多数绑定)

...
and                                                 Boolean AND
not x                                               Boolean NOT
in, not in, is, is not, <, <=, >, >=, !=, ==        Comparisons, including membership tests and identity tests
...

不是 的事实是在之后 出现的,这意味着将在之前 进行评估(由于懒惰评估可能都无法评估-谢谢@NickA的注释),因此该表达式等同于(为清楚起见添加括号):

if a and (b is not None):

此外,根据[Python 3]: Truth Value Testing

  

可以测试任何对象的真值,以用于ifwhile条件中,或用作以下布尔运算的操作数。

您的 if 语句完全 OK (产生 bool )。

示例(使用[Python 3]: class bool([x])):

>>> bool(0)
False
>>> bool(100)
True
>>> bool([])
False
>>> bool([0])
True
>>> bool(None)
False
>>> bool({})
False
>>> bool({1: 1})
True
>>> bool(None is not None)
False
>>> bool(1 is not None)
True
>>> bool(2 and 1 is not None)
True

答案 3 :(得分:1)

在此代码中,您首先评估b is not None,这是一个布尔值。

然后a被隐式转换为布尔值 (对于list / dict,如果为空,则为False;对于数字,如果数字为0,则为False

然后对and求值,该值总是返回一个布尔值。

答案 4 :(得分:1)

这肯定是有效的。

当我们获取一个已分配了值的变量,并对另一个具有空值的变量(在python-无)中执行 AND 操作时,会产生 AND 操作中。因此,可以进行检查。为了阐明我的观点,请参考以下内容。

a=2;c=None; b=11
if a and c is not None:
    print("T")
else:
    print("F")

print(a and c)

结果

print(a and b)

得出非空值-在我们的示例中为 11