and or技巧

2.7. and-or 技巧

若是你是一名C语言高手,固然对 bool ? a : b 表达式熟悉,这个表达式当   bool 为真时计算为 a,其它值则为 b。象不少编程技巧同样,它是一种诱人的便利。你可在Python中完成一样的事情,可是须要彻底理解它是如何工做的,以免不明显的毛病。html

例 2.17. and-or 技巧python

a = "first"

>>> b = "second">>> 1 and a or b 'first'>>> 0 and a or b 'second'

1

这个语法看起来与C语言中的 bool ? a : b 类似。第一部分将在布尔环境中进行计算,它能够是任意Python表达式。若是计算为真,整个表达式的值为         a。程序员

2 若是第一部分计算为假,整个表达示的值为 b。

然而,由于这个Python表达式是简单的布尔逻辑,而不是一个特殊的语言结构,因此在这个Python的 and-or 技巧与C中的 bool   ? a : b 语法之间,有一个很是,很是,很是重要的不一样。若是 a 的值为假,表达式将不会按你指望的那样执行。(你能知道我被这个问题折腾过吗?不仅一次?)编程

例 2.18. 什么时候 and-or 技巧失败api

a = ""

>>> b = "second">>> 1 and a or b'second'

由于 a 是一个空串,空串在一个布尔环境中被Python当作假值,这个表达式将“失败”,且返回 b 的值。若是你不将它想象成象   bool ? a : b 同样的语法,而把它当作纯粹的布尔逻辑,这样的话就会获得正确的理解。   1 是真,a 是假,因此 1 and a 是假。假 or b是 b。安全

Important
这个 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

Note
一个负责的程序员应该将 and-or 技巧封装成一个函数:
def choose(bool, a, b):

    return (bool and [a] or [b])[0]
相关文章
相关标签/搜索