本文主要是介绍2.3 解释一下python的 and-or 语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
So:
python 的and-or语法 bool and a or b
就相当于bool? a: b
但是特殊情况是,若a为假,则不会相当于,而是返回b
解决办法:用 (bool and [a] or [b])[0]代替
当然,负责人的话,就将
(bool and [a] or [b])[0]封装成一个函数啦~
一、http://www.kuqin.com/diveinto_python_document/apihelper_andor.html
如果你是一名C语言高手,当然对 bool ? a : b 表达式熟悉,这个表达式当 bool 为真时计算为 a,其它值则为 b。象很多编程技巧一样,它是一种诱人的便利。你可在Python中完成同样的事情,但是需要完全理解它是如何工作的,以避免不明显的毛病。
>>> a = "first">>> b = "second">>> 1 and a or b 'first'>>> 0 and a or b 'second'
这个语法看起来与C语言中的 bool ? a : b 相似。第一部分将在布尔环境中进行计算,它可以是任意Python表达式。如果计算为真,整个表达式的值为 a。 | |
如果第一部分计算为假,整个表达示的值为 b。 |
然而,因为这个Python表达式是简单的布尔逻辑,而不是一个特殊的语言结构,所以在这个Python的 and-or 技巧与C中的 bool ? a : b 语法之间,有一个非常,非常,非常重要的不同。如果 a 的值为假,表达式将不会按你期望的那样执行。(你能知道我被这个问题折腾过吗?不只一次?)
>>> a = "">>> b = "second">>> 1 and a or b'second'
因为 a 是一个空串,空串在一个布尔环境中被Python看成假值,这个表达式将“失败”,且返回 b 的值。如果你不将它想象成象 bool ? a : b 一样的语法,而把它看成纯粹的布尔逻辑,这样的话就会得到正确的理解。 1 是真,a 是假,所以 1 and a 是假。假 or b 是b。
这个 and-or 技巧,bool and a or b,当 a 为假时,不会象C表达式 bool ? a : b 一样工作。 |
The real trick behind the and-or trick, then, is to make sure that the value of a is never false. One common way of doing this is to turn a into [a] and b into [b], then taking the first element of the returned list, which will be eithera or b.
Example 2.19. Using the and-or trick safely
>>> a = "">>> b = "second">>> (1 and [a] or [b])[0]''
因为 [a] 是一个非空列表,它永远不会为假。甚至 a 是 0 或 '' 或其它假值,列表 [a] 为真,因为它有一个元素。
到现在为止,这个技巧可能看上去问题超过了它的价值。毕竟你可以用一个 if 语句完成相同的事情,那么为什么要经受这些麻烦呢?哦,在很多情况下,要在两个常量之间进行选择,所以可以使用更简单的语法而不必担心,因为你知道 a 值将总是真。并且尽管你不得不使用更复杂的安全形式,也有一些好的理由来使用这个技巧;在Python中有很多时候, if 语句不允许使用,这一点我们将在下一节看到。
一个负责的程序员应该将 and-or 技巧封装成一个函数: def choose(bool, a, b):return (bool and [a] or [b])[0] |
一、and:
在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。
>>> 'a' and 'b' 'b' >>> '' and 'b' '' >>> 'a' and 'b' and 'c' 'c'
在布尔上下文中从左到右演算表达式的值,如果布尔上下文中的所有值都为真,那么 and 返回最后一个值。
如果布尔上下文中的某个值为假,则 and 返回第一个假值
二、or:
>>> 'a' or 'b' 'a' >>> '' or 'b' 'b' >>> '' or [] or {}
{} >>> 0 or 'a' or 'c' 'a'
[code]
使用 or 时,在布尔上下文中从左到右演算值,就像 and 一样。如果有一个值为真,or 立刻返回该值
如果所有的值都为假,or 返回最后一个假值
注意 or 在布尔上下文中会一直进行表达式演算直到找到第一个真值,然后就会忽略剩余的比较值
三、and-or:
and-or 结合了前面的两种语法,推理即可。
[code]
>>> a='first' >>> b='second' >>> 1 and a or b 'first' >>> (1 and a) or b 'first' >>> 0 and a or b 'second' >>> (0 and a) or b 'second' >>>
这个语法看起来类似于 C 语言中的 bool ? a : b 表达式。整个表达式从左到右进行演算,所以先进行 and 表达式的演算。 1 and 'first' 演算值为 'first',然后 'first' or 'second' 的演算值为 'first'。
0 and 'first' 演算值为 False,然后 0 or 'second' 演算值为 'second'。
and-or主要是用来模仿 三目运算符 bool?a:b的,即当表达式bool为真,则取a否则取b。
and-or 技巧,bool and a or b 表达式,当 a 在布尔上下文中的值为假时,不会像 C 语言表达式 bool ? a : b 那样工作。
四、安全使用and-or
>>> a="" >>> b="second" >>> (1 and [a] or [b])
[''] >>> (1 and [a] or [b])[0] '' >>>
由于 [a] 是一个非空列表,所以它决不会为假。即使 a 是 0 或者 '' 或者其它假值,列表 [a] 也为真,因为它有一个元素。
一个负责的程序员应该将 and-or 技巧封装成一个函数:
def choose(bool,a,b): return (bool and [a] or [b])[0] print choose(1,'','second') #''
这篇关于2.3 解释一下python的 and-or 语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!