python中用于表示逻辑与_在if语句中,Python等效于&&(逻辑与)

我在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结果。因此,这些要点可能与您无关。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值