若是你是一名C语言高手,固然对 bool ? a : b 表达式熟悉,这个表达式当 bool 为真时计算为 a,其它值则为 b。象不少编程技巧同样,它是一种诱人的便利。你可在Python中完成一样的事情,可是须要彻底理解它是如何工做的,以免不明显的毛病。html
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 either a or b.函数
Example 2.19. Using the and-or trick safelythis
a = "" >>> b = "second">>> (1 and [a] or [b])[0]''
由于 [a] 是一个非空列表,它永远不会为假。甚至 a 是 0 或 ''或其它假值,列表 [a] 为真,由于它有一个元素。code
到如今为止,这个技巧可能看上去问题超过了它的价值。毕竟你能够用一个 if 语句完成相同的事情,那么为何要经受这些麻烦呢?哦,在不少状况下,要在两个常量之间进行选择,因此可使用更简单的语法而没必要担忧,由于你知道 a 值将老是真。而且尽管你不得不使用更复杂的安全形式,也有一些好的理由来使用这个技巧;在Python中有不少时候, if语句不容许使用,这一点咱们将在下一节看到。htm
![]() |
一个负责的程序员应该将 and-or 技巧封装成一个函数: def choose(bool, a, b): return (bool and [a] or [b])[0] |