我在IF条件中遇到错误。我究竟做错了什么?
得到a的原因SyntaxError是&&Python中没有运算符。同样||,!并且不是有效的 Python运算符。
您可能从其他语言中了解到的某些运算符在Python中使用不同的名称。逻辑运算符&&和||实际上被称为and和or。同样,逻辑否定运算符!称为not。
所以你可以这样写:
iflen(a)%2==0andlen(b)%2==0:
甚至:
ifnot(len(a)%2orlen(b)%2):
一些其他信息(可能会派上用场):
我在此表中总结了运算符“等效项”:
+------------------------------+---------------------+| Operator (other languages) | Operator (Python) |+==============================+=====================+| && | and |+------------------------------+---------------------+| || | or |+------------------------------+---------------------+| ! | not |+------------------------------+---------------------+
除了逻辑运算符外,Python还具有按位/二进制运算符:
+--------------------+--------------------+| Logical operator | Bitwise operator |+====================+====================+| and | & |+--------------------+--------------------+| or | | |+--------------------+--------------------+
Python中没有按位取反(只是按位逆运算符~-但这并不等效于not)。
逻辑运算符(像许多其他语言一样)具有使它们短路的优点。这意味着,如果第一个操作数已经定义了结果,则根本不会对第二个运算符求值。
为了说明这一点,我使用了一个简单地使用值的函数,将其打印并再次返回。方便查看由于print语句而实际评估的内容:
>>>defprint_and_return(value):...print(value)...returnvalue>>>res=print_and_return(False)andprint_and_return(True)False
如您所见,仅执行了一个print语句,因此Python甚至没有查看正确的操作数。
对于二进制运算符,情况并非如此。那些总是评估两个操作数:
>>>res=print_and_return(False)&print_and_return(True);FalseTrue
但是,如果第一个操作数不够用,那么,当然会计算第二个运算符:
>>>res=print_and_return(True)andprint_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(!)中,andand 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 leftelse:return evaluate(expr2)
请注意,这是伪代码,而不是Python代码。在Python中,您无法创建称为and或的函数,or因为这些是关键字。另外,您永远不要使用“评估”或if bool(...)。
自定义自己的类的行为
这隐含bool调用可用于自定义您的类的行为有and,or和not。
为了说明如何进行自定义,我使用该类来再次print跟踪正在发生的事情:
classTest(object):def__init__(self,value):self.value=valuedef__bool__(self):print('__bool__ called on {!r}'.format(self))returnbool(self.value)__nonzero__=__bool__# Python 2 compatibilitydef__repr__(self):return"{self.__class__.__name__}({self.value})".format(self=self)
因此,让我们看看与这些运算符结合使用该类会发生什么:
>>>ifTest(True)andTest(False):...pass__bool__ called onTest(True)__bool__ called onTest(False)>>>ifTest(False)orTest(False):...pass__bool__ called onTest(False)__bool__ called onTest(False)>>>ifnotTest(True):...pass__bool__ called onTest(True)
如果您没有__bool__方法,Python还将检查对象是否具有__len__方法,以及它是否返回大于零的值。如果您创建了序列容器,可能会很有用。
NumPy数组和子类
可能超出了原始问题的范围,但是如果您要处理NumPy数组或子类(如Pandas Series或DataFrames),则隐式bool调用将引发可怕的问题ValueError:
>>>importnumpyasnp>>>arr=np.array([1,2,3])>>>bool(arr)ValueError:Thetruth value of an arraywithmore than one elementisambiguous.Usea.any()ora.all()>>>arrandarrValueError:Thetruth value of an arraywithmore than one elementisambiguous.Usea.any()ora.all()>>>importpandasaspd>>>s=pd.Series([1,2,3])>>>bool(s)ValueError:Thetruth value of aSeriesisambiguous.Usea.empty,a.bool(),a.item(),a.any()ora.all().>>>sandsValueError:Thetruth value of aSeriesisambiguous.Usea.empty,a.bool(),a.item(),a.any()ora.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__方法中返回布尔值的操作数:
classTest(object):def__init__(self,value):self.value=valuedef__bool__(self):returnself.value__nonzero__=__bool__# Python 2 compatibilitydef__repr__(self):return"{self.__class__.__name__}({self.value})".format(self=self)>>>x=Test(10)andTest(10)TypeError:__bool__ shouldreturnbool,returned int>>>x1=Test(True)andTest(10)>>>x2=Test(False)andTest(10)
这是因为,and如果第一个操作数求和False,则实际返回第一个操作数;如果求和,True则返回第二个操作数:
>>>x1Test(10)>>>x2Test(False)
同样,or但相反:
>>>Test(True)orTest(10)Test(True)>>>Test(False)orTest(10)Test(10)
但是,如果您在if语句中使用它们,if也会隐式调用bool结果。因此,这些要点可能与您无关。