我正在查看一些似乎可以运行的代码,因为没有人抱怨它,但是对他们编写的内容感到很困惑:
if a and b is not None:
# do something
我一直认为'and'运算符是返回True或False的东西,现在我开始怀疑自己..它还会返回什么,一个数字..它可能不是pythonic,但我是否缺少某些东西-有人怎么写这样的东西?
答案 0 :(得分:5)
这表示a is Truthy
和b 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:
您的 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