Python学习笔记整理(十)Python的if测试
if语句是选取要执行的操作.
一、if语句
1、通用格式
形式是if测试,后面跟着一个或多个可选的elif(else if)测试,以及一个最终选用的else块。测试和else部分可以结合嵌套语句块,缩进列在行首下面。Python会执行第一个结算结果为真的代码块,或者如果所有测试都为假时,就执行else块。
if语句一般形式如下:
if <test1>:
<statements1>
elif <test2>:
<statements2>
else:
<statements3>
2、基本列子
除了开头的if测试及其关联的语句外,其他所有部分都是可选择。
>>> if 1:
... print 'True'
...
True
需要处理测试为假的情况,需要else。else就是所有测试条件都不满足情况下的默认选择
>>> if not 1:
... print 'true'
... else:
... print 'false'
...
false
3、多路分支
>>> x='killer rabbit'
>>> if x == 'roger':
... print "how's jessica?"
... elif x == 'bugs':
... print "what's up doc?"
... else:
... print "Run away!"*2
...
Run away!Run away!
Ptyhon中没有swith和case语句。在Ptyhon多路分支写成一系列的if/elif测试。或者对字典进行索引运算或者搜索列表。因为字典和列表可以在运行时创建,有时会比硬编码的if逻辑更具有灵活性.
>>> choice='ham'
>>> print {'spam':1.25,
... 'ham': 1.99,
... 'eggs':0.99,
... 'bacon':1.10}[choice]
1.99
这个字典是多路分支,根据键的选择进行索引,在分支到这组值的其中一个。比起C语言的switch,两者等效,也可以使用Python语句表达。不过使用if表达不够简洁。
字典默认值能够通过has_keys测试,get方法调用或异常捕捉来处理。在字典式的多路分支中用于编写默认动作。这里通过get支持处理默认值
的情况
>>> Ptest={'name':'diege','age':18,'sex':'M'}
>>> print Ptest.get('name','Bad choice')
diege
>>> print Ptest.get('class','Bad choice')
Bad choice
后面会学到字典也可以包含函数,从而代表更为复杂的分支动作,并实现一般的跳跃表格。这类函数做为字典的值,通常写成lamdba,通过增加括号调用来触发器动作
再来一个例子
###对比shell中的条件表达式######
if [test1]
then
do something1
elif [test2]
then
do something2
else
do something3
fi
二、Python语法规则
Python都有简单和基本的语句语法,但是,有些特定是我们需要知道的。
* 语句是逐个运行,除非你不这样写
* 块和语句的边际会自动被检测
* 复合语句=首行+“:”+缩进语句
* 空白行,空格,以及注释通常都会被忽略。
* 文档字符串(docstring)会被忽略,但会被保存并由工具显示。
Pyton支持另外一种注释,称为文档字符串。
1、代码块分隔符
自动以行缩进检测块的边际。缩进至右侧相同距离的所有语句属于同一块的代码。块内的语句都会垂直对齐,好像是在一个栏之内。
2、语句分隔符
Python的语句一般都是在其所在行的末尾结束的,不过,当语句太长了,难以单放在一行时,有些特殊的规则可以用于其位于多行之中。
1)如果使用语法括号对,语句就可以横跨数行。如在封闭的(),{},[]这类配对中编写代码。紧接着的行可以在任何缩进层次开始,而且应该全部垂直对齐。
2) 如果语句以反斜线结尾,就可以横跨数行。
3)三重引号字符串常量可以横跨数行
4)其他规则:有关语句分隔符。注释和空白也能出现在文件的任意之处。注释则出现在行的末尾终止
3、一些特殊情况
if (a==b and c==d and
d==e and ee==f):
print "new"
Python允许在相同行上编写一个以上的非复合语句(语句内未嵌套其他语句),有分号隔开。
>>> x=3;y=2;print x*y
6
三、真值测试
在Python中:
* 任何非0数字或非空对象对象都是真
* 数字0,空对象以及特殊对象None都被认作是假
* 比较和相等测试会递归地应用在数据结构中。
* 比较和相等测试会返回True或False(1和0的特殊版本)
* 布尔and和or运算符会返回真或假的操作对象
布尔运算符是用于结合其他测试的结果,Python中有三种布尔表达式运算符:
X and Y
如果X和Y都为真,就是真
X or Y
如果X或Y为真,就是真
not X
如果X为假,那就为真(表达式返回True或False)
X和Y可以是任何真值或返回真值的表达式(如相等测试,范围比较等)。此外布尔and和or运算符在Python中返回真或假对象,
而不是True或False.返回and或or运算符左侧或者右侧的对象。(注意:每一个对象不是真就是假)
对or而言,从左到右求运算操作对象,然后返回第一个为真的操作对象。Ptyhon会在其找到第一个真值地方停止。【如果没有为真的呢?】
对and而言,计算所有为真时才会真,返回最后一个为真的对象。停止在第一个为假的对象上
1、if/else三元表达式
Python2.5引入的新的表达式
A=Y if X else Z
只有当X为真时才会执行表达式Y,而只有当X为假时,才会执行表达式Z
>>> A='t' if 'diege' else 'f'
>>> A
't'
>>> A='t' if '' else 'f'
>>> A
'f'
>>> x=""
>>> y=1
>>> z=2
>>> y if x else z
2
>>> x=9
>>> y if x else z
1
2.5版本以前,相同效果可以小心使用and和or
A=((X and Y) or Z)
使用下列表达式也类似的,因为bool函数会把X转换成对应的整数1或0,然后用于从列表中挑选真假值。
A=[Z,Y][bool(X)]
>>> ['f','t'][bool("")]
'f'
C的语法,也是shell的
Y?X:Z
2、为什么要在意布尔值
X=A or B or C or None
这样的语句会把X设置A,B以及C中第一个非空(为真)的对象,或者如果所有对象都未空,就设置为None.
这样可行是因为or运算符返回两对象之一。这成为Python中相当常见的编写代码手法:从一个固定大小的集合中选择非空的对象只要在其串在一个or表达式中即可。
短路计算也很重要,因为布尔运算右侧的表达式肯能会调用函数来执行实质或重要的工作。不然,如果短路规则生效,附加效果就不会发生了。
if f1() or f2():...
这里如果f1返回真值(非空),python将不会再执行f2(),为了保证两个函数都会执行,要再or之前调用它们。
tmp1,tmp2=f1(),f2()
if tmp1 or tmp2:...
用来模拟if/else语句:((A and B) or C )
假定B真,A为真返回B【A,B都为真返回B,B为真,直接返回B,不计算C】,如果不是指返回C
最后,因为所有对象本质都是真或假,Python中,直接测试对象 ( if X:),而不是和空值比较(if X !='':), 前者更常见也更简单,就字符串而言,测试是等效的。