逻辑运算符包括逻辑与、逻辑或、逻辑非,英文分别对应:(logical)and、or、not。由于逻辑运算返回的是布尔值true(真)或false(假),因此逻辑运算符也叫布尔运算符。(英文operator在程序设计的语境下有两种译为:运算符、操作符。)

Python中的逻辑运算符有一个非常有意思的特性——“短路”,即不做无用功、选择最短路线。具体来说,逻辑运算中的短路表现在逻辑运算符只对有必要求值的表达式求值。例如,表达式x and y(x和y都有可能是表达式),只在x和y同时为真的情况下才会返回True。显然,如果x为假,那么就没有再对y求值的必要了——即使y为真,整个表达式仍然会返回False。因此,and运算符的行为就是:如果x为假,返回x;否则,返回y。

and运算符的这种行为就叫“短路逻辑”(或者懒惰求值)。可见,逻辑运算符的右运算数(如这里的y)有可能不会被求值——原因就是“短路”。

同样,or运算符也有短路行为。例如,对于表达式x or y,如果x是真,则返回x;否则,返回y。

设计短路逻辑有目的何在呢?主要是为了减少不必要的计算。但是,在短路逻辑的基础上,还可以实现一些巧妙的结构。例如:

name = raw_input(‘Enter name:’) or ‘<unknow>’

这个赋值语句就利用逻辑运算符or实现了在用户输入为空的情况下为name设置默认值的操作。另外,利用短路逻辑还可以实现另一种运算符,即条件运算符,或者叫三元运算符:

b if a else c # 如果a为真,则返回b;否则,返回c

短路逻辑与条件运算符同样也存在于JavaScript中。即,x && y的行为是:如果x可以转换false,则返回x;否则,计算并返回y的值。x || y的行为是:如果x可以转换为true,则返回x;否则,计算并返回y的值。显示,如果&&、||运算符分别在x可转换为false、true的情况下,会执行短路操作——忽略右运算数y。

而利用or运算符的短路行为,JavaScript也实现了为变量赋默认值:

//如果name可以转换为false,则不能短路,必须对右运算符求值,从而实现赋默认值
var name = name || ‘unprovided’;

以及另一种表现形式的条件表达式——?::

x > 0 ? x * y : -x * y



我来说两句儿


麻烦输入验证码 If you cannot see the CheckCode image,please refresh the page again!