莫回无
我在IF条件中遇到错误。我究竟做错了什么?你得到的原因SyntaxError是&&Python中没有运算符。同样||和!是不是有效的Python运营商。您可能从其他语言中了解到的某些运算符在Python中具有不同的名称。逻辑运算符&&和||实际上叫and和or。同样,!调用逻辑否定运算符not。所以你可以写:if len(a) % 2 == 0 and len(b) % 2 == 0:甚至:if not (len(a) % 2 or len(b) % 2):一些额外的信息(可能派上用场):我在此表中总结了运算符“equivalent”:+------------------------------+---------------------+| Operator (other languages) | Operator (Python) |+==============================+=====================+| && | and |+------------------------------+---------------------+| || | or |+------------------------------+---------------------+| ! | not |+------------------------------+---------------------+另见Python文档:6.11。布尔运算。除了逻辑运算符,Python还有按位/二元运算符:+--------------------+--------------------+| Logical operator | Bitwise operator |+====================+====================+| and | & |+--------------------+--------------------+| or | | |+--------------------+--------------------+Python中没有按位否定(只是按位逆运算符~- 但这不等同于not)。另见6.6。一元算术和按位/二进制运算和6.7。二进制算术运算。逻辑运算符(与许多其他语言一样)具有这些短路的优点。这意味着如果第一个操作数已经定义了结果,则根本不评估第二个操作符。为了表明这一点,我使用一个只需要一个值的函数,打印它并再次返回它。由于print语句,这对于查看实际评估的内容非常方便:>>> def print_and_return(value):... print(value)... return value>>> res = print_and_return(False) and print_and_return(True)False正如您所看到的,只执行了一个print语句,因此Python甚至没有查看正确的操作数。二元运算符不是这种情况。那些总是评估两个操作数:>>> res = print_and_return(False) & print_and_return(True);FalseTrue但是,如果第一个操作数不够,那么当然会评估第二个操作符:>>> res = print_and_return(True) and print_and_return(False);TrueFalse总结这里是另一个表:+-----------------+-------------------------+| Expression | Right side evaluated? |+=================+=========================+| `True` and ... | Yes |+-----------------+-------------------------+| `False` and ... | No |+-----------------+-------------------------+| `True` or ... | No |+-----------------+-------------------------+| `False` or ... | Yes |+-----------------+-------------------------+在True与False代表什么bool(left-hand-side)返回,他们不必是True或False,他们只需要返回True或False当bool被要求他们(1)。所以在Pseudo-Code(!)中and,or函数的工作原理如下:def and(expr1, expr2): left = evaluate(expr1) if bool(left): return evaluate(expr2) else: return leftdef or(expr1, expr2): left = evaluate(expr1) if bool(left): return left else: return evaluate(expr2)请注意,这是伪代码而不是Python代码。在Python中,您无法创建被调用的函数,and或者or因为它们是关键字。你也不应该使用“评估”或if bool(...)。自定义您自己的类的行为此隐式bool调用可用于自定义类的行为方式and,or以及not。为了展示如何定制这个,我使用这个类print来跟踪发生的事情:class Test(object): def __init__(self, value): self.value = value def __bool__(self): print('__bool__ called on {!r}'.format(self)) return bool(self.value) __nonzero__ = __bool__ # Python 2 compatibility def __repr__(self): return "{self.__class__.__name__}({self.value})".format(self=self)那么让我们看看该类与这些运算符结合发生了什么:>>> if Test(True) and Test(False):... pass__bool__ called on Test(True)__bool__ called on Test(False)>>> if Test(False) or Test(False):... pass__bool__ called on Test(False)__bool__ called on Test(False)>>> if not Test(True):... pass__bool__ called on Test(True)如果您没有__bool__方法,那么Python还会检查对象是否有__len__方法,以及它是否返回大于零的值。如果您创建序列容器,这可能是有用的。另见4.1。真值测试。NumPy数组和子类可能有点超出原始问题的范围但是如果你正在处理NumPy数组或子类(如Pandas Series或DataFrames),那么隐式bool调用将引发可怕的ValueError:>>> import numpy as np>>> arr = np.array([1,2,3])>>> bool(arr)ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()>>> arr and arrValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()>>> import pandas as pd>>> s = pd.Series([1,2,3])>>> bool(s)ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().>>> s and sValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().在这些情况下,您可以使用NumPy中的逻辑和函数,它执行元素and(或or):>>> np.logical_and(np.array([False,False,True,True]), np.array([True, False, True, False]))array([False, False, True, False])>>> np.logical_or(np.array([False,False,True,True]), np.array([True, False, True, False]))array([ True, False, True, True])如果你只处理布尔数组,你也可以使用NumPy的二元运算符,这些运算符执行元素(也是二进制)比较:>>> np.array([False,False,True,True]) & np.array([True, False, True, False])array([False, False, True, False])>>> np.array([False,False,True,True]) | np.array([True, False, True, False])array([ True, False, True, True])(1)bool对操作数的调用必须返回True或False不完全正确。它只是需要在其__bool__方法中返回布尔值的第一个操作数:class Test(object): def __init__(self, value): self.value = value def __bool__(self): return self.value __nonzero__ = __bool__ # Python 2 compatibility def __repr__(self): return "{self.__class__.__name__}({self.value})".format(self=self)>>> x = Test(10) and Test(10)TypeError: __bool__ should return bool, returned int>>> x1 = Test(True) and Test(10)>>> x2 = Test(False) and Test(10)那是因为and如果第一个操作数的计算结果实际返回第一个操作数,False并且如果它的计算结果为,True则返回第二个操作数:>>> x1Test(10)>>> x2Test(False)同样的,or但反过来说:>>> Test(True) or Test(10)Test(True)>>> Test(False) or Test(10)Test(10)但是,如果您在if语句中使用它们,if则还会隐式调用bool结果。所以这些细节可能与您无关。