Python程序设计开发宝典
上QQ阅读APP看书,第一时间看更新

4.1 条件表达式

在选择结构和循环结构中,都要根据条件表达式的值来确定下一步的执行流程。条件表达式的值只要不是False、0(或0.0、0j等)、空值None、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价。从这个意义上来讲,所有的Python合法表达式都可以作为条件表达式,包括含有函数调用的表达式。

关于表达式和运算符的详细内容请参考2.2节,这里再重点介绍一下几个比较特殊的运算符。

1.关系运算符

Python中的关系运算符可以连续使用,这样不仅可以减少代码量,也比较符合人类的思维方式。

        >>>print(1<2<3)                               #等价于1<2 and 2<3
        True
        >>>print(1<2>3)
        False
        >>>print(1<3>2)
        True

在Python语法中,条件表达式中不允许使用赋值运算符“=”,避免了误将关系运算符“==”写成赋值运算符“=”带来的麻烦。在条件表达式中使用赋值运算符“=”将抛出异常,提示语法错误。

        >>>if a=3:                                    #条件表达式中不允许使用赋值运算符
        SyntaxError: invalid syntax
        >>>if (a=3) and (b=4):
        SyntaxError: invalid syntax

关系运算符具有惰性计算的特点,只计算必须计算的值,而不是计算关系表达式中的每个表达式。

        >>>1>2>xxx                                    #当前上下文中并不存在变量xxx
        False

2.逻辑运算符

逻辑运算符and、or、not分别表示与、或、非3种逻辑运算,在功能上可以与电路的连接方式做个简单类比:or运算符类似于并联电路,只要有一个开关是通的那么灯就是亮的;and运算符类似于串联电路,必须所有开关都是通的灯才会亮;not运算符类似于短路电路,如果开关通了那么灯就灭了,如图4-1所示。

图4-1 逻辑运算符与几种电路的类比关系

与关系运算符类似,逻辑运算符and和or具有短路求值或惰性求值的特点,可能不会对所有表达式进行求值,而是只计算必须计算的表达式的值。以and为例,对于表达式“表达式1 and表达式2”而言,如果“表达式1”的值为False或其他等价值时,不论“表达式2”的值是什么,整个表达式的值都是False,丝毫不受“表达式2”的影响,因此“表达式2”不会被计算。在设计包含多个条件的条件表达式时,如果能够大概预测不同条件失败的概率,并将多个条件根据and和or运算符的短路求值特性来组织顺序,可以提高程序运行效率。

        >>>3 and 5
        5
        >>>3 or 5
        3
        >>>0 and 5
        0
        >>>0 or 5
        5
        >>>not 3
        False
        >>>not 0
        True

下面的函数使用指定的分隔符把多个字符串连接成一个字符串,如果用户没有指定分隔符则使用逗号。

        >>>def Join(chList, sep=None):
            return (sep or', ').join(chList)        #注意:参数sep不是字符串时会抛出异常
        >>>chTest=['1', '2', '3', '4', '5']
        >>>Join(chTest)
        '1,2,3,4,5'
        >>>Join(chTest, ':')
        '1:2:3:4:5'

当然,也可以把上面的函数直接定义为下面带有默认值参数的形式:

        >>>def Join(chList, sep=', '):
            return sep.join(chList)