Python3从入门到实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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用于语法上需要语句而实际不需要做任何工作的地方,或者用作占位符,以等待后续补充代码。