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)