2.7 控制语句
2.7.1 if条件语句
1.if条件语句
前面讲解的程序语句都是按照书写的顺序自上而下一条一条地执行,但有时需要根据不同情况选择执行不同的语句。例如,输入学生成绩,根据成绩是否小于60打印“及格”或“不及格”,在Python程序中,可以用if语句实现。例如:
score=float(input("请输入学生成绩:")); if score>=60: print("恭喜你!") print("通过了考试。")
输出:
请输入学生成绩:60.5 恭喜你! 通过了考试。
上述程序使用了最简单的if语句(也称if条件语句,英文if的意思是“如果”)。其语言格式如下:
if 表达式:
程序块代码
if关键字后面跟1个表达式和冒号:,然后是缩进的语句(程序块)。其含义是,如果“表达式”的值是True,则执行if语句体,即缩进的程序块代码;如果“表达式”的值是False,则不会执行缩进的程序块代码。
2.代码缩进
if语句体的多条语句必须具有一致的缩进,即这些语句的第1个字母必须对齐,且不能和if关键字对齐。例如,下面的if语句没有缩进因此语法是错误的:
if score>=60: print("恭喜你!") print("通过了考试。")
执行上述语句会产生“缩进错误(IndentationError)”:
File "<ipython-input-2-362eeb5f9c61>", line 2 print("恭喜你!") IndentationError: expected an indented block
同样,if语句体中语句不具有“一致的”缩进也是错误的。例如:
if score>=60: print("恭喜你!") print("通过了考试。")
if语句还有另外一种形式(if…else):
if 表达式: 程序块1 else: 程序块2
上述形式中,“表达式”的值如果为True,则执行“程序块1”中的代码,如果为False,则执行“程序块2”中的代码。英文else的意思是“否则”。
例如:
score=int(input("请输入学生成绩:")); if score>=60: print("恭喜你!") print("通过了考试。") else: print("很可惜!") print("你未通过考试。") print("继续努力,加油!")
这段代码的意思是,如果达到了60分就显示祝贺的信息,否则,就鼓励学生继续努力。
if语句还有另外一种形式(if…elif…else):
if 表达式1: 程序块1 elif 表达式2: 程序块2 elif 表达式3: 程序块2 else: 程序块k
对多个不同的条件依次进行判断时,首先判断if里的“表达式1”是否为True,如果为True就执行“程序块1”,否则就继续判断下面的elif的“表达式2”是否为True,如果为True就执行“程序块2”,否则就继续判断下面的elif的“表达式3”是否为True, …,依次判断下去,如果前面的表达式都不是True,就执行最后的else里的“程序块k”。
英文elif的意思是“否则如果”。例如:
score=int(input("请输入学生成绩:")); if score<60: print("不及格") elif score<70: print("及格") elif score<80: print("中等") elif score<90: print("良好") else: print("优秀");
这段代码根据输入的不同的百分制分数,输出5个等级中的1个。
if ...else…还有如下的一种用法:
A if B else C
其含义是,如果B成立就执行A,否则就执行C。例如:
a, b=int(input("a")), int(input("b")) print("a>b")if a>b else print("!(a>b)")
执行上述代码,输入3个整数的运行情况:
a3 b5 !(a>b)
2.7.2 循环语句
有时需要在某种条件满足的情况下重复执行某个语句(块)。例如,要编写一个程序统计学生的平均成绩,因为不知道程序使用时实际的学生人数,通常会让用户从键盘或文件不断输入学生成绩数据,并且将输入的分数累加为总分数,最后在某种条件下结束这个输入过程,并将总分数除总人数,从而得到平均成绩。
再例如,要计算一组数的和,如1+2+3+4的和,可以简单地写出所有数,通过+将它们累加起来:
print(1+2+3+4)
但如果要计算1到1000之间的所有整数之和,那么写出所有这些数字的连加是不现实的,当然也不能写成“1+2+3+…+1000”形式,那么如果计算呢?
这就需要用到循环语句(也称迭代语句):当某个条件成立时,就一直重复执行某块程序代码(循环体中的代码)。
1.while循环语句
while循环语句的语法格式如下:
while 表达式:
程序块
当关键字while后的“表达式”为True,就重复执行循环体中的“程序块”。例如:
i=1 s=0 while i<=1000: s=s+i; #等价于 s +=i i+=1 print(s)
只要i不超过1000,就一直执行由“s=s+i”和“i+1”构成的while循环语句的循环体。当i>1000时,while语句才真正执行完。
例如,可以用while循环语句编写计算学生平均成绩:
total_score=0 i=0 score=float(input("请输入学生成绩:")) while score>=0: total_score +=score i +=1 score=float(input("请输入学生成绩:")) print(’平均成绩为:', total_score/i)
该程序只要输入的学生分数大于等于0,就一直执行循环体,当输入分数为负数时,就停止循环,输出最后的平均成绩“total_score/i”。
2.for循环语句
Python还有一个用于遍历访问一个容器(如str、list或tuple等容器)对象的每个元素的for... in循环。其语法格式是:
for e in 可迭代对象 对e的处理语句块
其含义是依次访问可迭代对象(iterable)中的每个元素e,并对该元素e用for循环体的语句块进行处理。例如:
numbers=[23, 41,19,87,67,2,32] sum=0 # 对列表中的每个元素val for val in numbers: sum=sum+val print("The sum is", sum) # 输出和sum
该循环将list对象numbers的每个整数累加到sum中,最后输出这个sum:
The sum is 271
再如:
words=['cat', 'dog', 'book'] for w in words: print(w, len(w)) for c in "world": print(c)
输出:
cat 3 dog 3 book 4 w o r l d
注:可迭代对象(将在本书第8章介绍)是可以通过for循环迭代地访问其中的元素的一种对象,如前面的容器list、tuple、set、dict和字符串str类型的对象都是可迭代对象。上面的例子中通过for可访问一个str对象中的每个字符。例如,内置函数range()可以产生1对整数之间的1个可迭代对象:
for e in range(2,8): print(e, end=" ")
输出:
2 3 4 5 6 7
函数range()的语法格式是:
range(start, stop[, step])
该函数返回一个可迭代对象,该对象包含了介于start和stop之间(但不包含stop)的一系列整数的可迭代对象:
start、start+step、start+step+step、…
可以将函数range()产生的可迭代对象传递给内置函数list()或tuple()等构造一个list对象或tuple()对象。例如:
L=list(range(2,8,2)) print(L) t=tuple(range(2, -8, -2)) print(t)
输出:
[2, 4, 6, ] (2, 0, -2, -4, -6)
3.break语句
在重复执行循环体时,如果满足某种条件,就可以用break语句跳出循环,即不再执行循环体。
例如,前面的计算1到1000之间的整数和、统计学生平均成绩等程序都可以改写为用break语句终止循环体的执行。例如:
i=1 s=0 while True: #条件永远满足 s=s+i; #等价于 s+=i i+=1 if i>1000: #i大于1000时,跳出循环体 break; print(s)
该代码当i>1000时,用break语句跳出while语句,然后执行print()。
输出:
500500
4.continue语句
Python还提供了一个在循环体中使用的 continue 语句。在执行循环体时,如果遇到 continue语句,则会停止执行其后续语句,返回循环开头继续执行循环体。
例如,以下程序计算一个整数列表中的所有非负整数之和:
#计算list中的所有非负数之和 numbers=[23, 41, -19,87, -3,67,2, -32] sum=0 for val in numbers: if val<0: continue sum +=val print("The sum is", sum) # 输出和sum
当循环体中遇到val小于0的数,就用continue语句返回循环开始,而不会执行其后面的“sum+=val”,也就是说,负数就不累加,只累加非负数。
5.else语句
循环语句(for或while)都可以在后面跟一个else语句,当for语句遍历完整个可迭代对象(如遍历完整个list的元素),或者当while语句的条件表达式是false退出时,都会执行这个else语句。但是,如果是通过break跳出循环语句则不会执行这个else语句。例如:
alist=[3, 1, 5] for i in alist: print(i) else: print("已经访问了列表alist的所有元素。")
输出:
3 1 5 已经访问了列表alist的所有元素
2.7.3 pass语句
pass是一个空语句,Python程序有的地方需要一条语句,但是又不希望这条语句执行任何动作,这时就可以用pass语句,使程序不会产生语法错误。或者,编写程序时还未想好写什么代码,此时可以临时用一个pass语句作为“占位符”,等以后再补充添加代码语句。例如:
score=float(input("输入一个成绩:")) if score <0: pass #没有这个pass,程序就会出错 else: print("分数是:", score)
总结
● if条件语句根据条件表达式是否满足而执行不同的程序块,有if、if...else、if...elif...else等多个变化用法。
● while循环语句是当条件表达式为True时,会一直执行循环体中的程序块。循环for语句是迭代访问一个可迭代对象的所有元素。
● break语句用于跳出循环。continue语句用于终止循环体中后续的语句执行,重新开始下一轮循环。除非用break语句跳出循环,否则循环结束总会执行else语句。
● 空语句pass用于语法上需要语句而实际不需要做任何工作的地方,或者用作占位符,以等待后续补充代码。