Python 和/或运算符返回值
我在看a,在18'27“演讲者声称”一些人可能知道在Python中Python 和/或运算符返回值,python,operators,logical-operators,Python,Operators,Logical Operators,我在看a,在18'27“演讲者声称”一些人可能知道在Python中和和或返回两个值中的一个,而not总是返回一个布尔值。“什么时候出现这种情况 据我所知,和和或也返回布尔值。和和和或运算符确实返回它们的一个操作数,而不是像True或False那样的纯布尔值: >>> 0 or 42 42 >>> 0 and 42 0 而not始终返回纯布尔值: >>> not 0 True >>> not 42 False 请参阅Pyt
和和或返回两个值中的一个,而not
总是返回一个布尔值。“什么时候出现这种情况
据我所知,和
和或也返回布尔值。和和和或运算符确实返回它们的一个操作数,而不是像True
或False那样的纯布尔值:
>>> 0 or 42
42
>>> 0 and 42
0
而not
始终返回纯布尔值:
>>> not 0
True
>>> not 42
False
请参阅Python文档中标准库参考中的表:
来自:
如果运算符的参数为false,则运算符不生成True,否则为false
表达式x和y首先计算x;如果x为false,则返回其值;否则,计算y并返回结果值
表达式x或y首先计算x;如果x为真,则返回其值;否则,计算y并返回结果值
Python的或运算符返回第一个Truth-y值或最后一个值并停止。这对于需要回退值的常见编程赋值非常有用
就像这个简单的例子:
print my_list or "no values"
如果列表中有任何内容,它将打印我的\u列表
。否则,它将打印无值
(如果列表为空,或无
…)
一个简单的例子:
>>> my_list = []
>>> print my_list or 'no values'
no values
>>> my_list.append(1)
>>> print my_list or 'no values'
[1]
>>> my_list = None
>>> print my_list and my_list.pop()
None
>>> my_list = [1]
>>> print my_list and my_list.pop()
1
使用和
,返回第一个False-y值或最后一个值并停止的恭维语,在需要防护而不是回退时使用
像这个:
my_list and my_list.pop()
这很有用,因为您不能在None
或[]
上使用list.pop
,这是列表的常见优先值
一个简单的例子:
>>> my_list = []
>>> print my_list or 'no values'
no values
>>> my_list.append(1)
>>> print my_list or 'no values'
[1]
>>> my_list = None
>>> print my_list and my_list.pop()
None
>>> my_list = [1]
>>> print my_list and my_list.pop()
1
在这两种情况下,都返回了非布尔值,并且没有引发异常。需要在@Frédéric的答案中添加一些点
是否返回其中一个操作数
这是真的,但这不是背后的逻辑。在python中,除0之外的数字被视为真,数字0被视为假
(0和42->False和True)=False
这就是它返回0的原因
(0或42->假或真)=42
在这种情况下,由于操作数42,语句将为True。因此,在这种情况下,python将返回导致语句为True的操作数。您知道返回的操作数顺序吗?从早到晚?确定结果的第一个值(从左到右)(即truish或falsish)是结果。可能会让您感到困惑的是,您可以在似乎需要布尔值的上下文中使用任何数据类型。“if 17:blah”是合法的。“is false”部分有点令人困惑。它更像是等于false或在if
中求值False@Adam不,这绝对不是“等于假”“。例如,0
和[]
都是false,但只有第一个等于false
。上一节详细解释了实际规则,但在头脑中保持清醒仍然有点混乱。这就是为什么在现实生活中,每个人(包括核心开发人员)都会说“真”和“假”,但参考文档避免了这一点。至于解释器对“假”的实际评估方式,我相信2.7在任何地方都不能完全定义它,尽管您可以从\uuuu nonzero\uuuu
文档中很好地猜测它的意思是x.\uu nonzero\uuuu()==0,除了AttributeError:x.\uu len\uuu()==0,除了AttributeError:False
。