开篇

你可能已经发现,前面的七期内容有一个共同的特点,那就是偏向理论基础,似乎学完之后只是了解了一些实用的方法,比如字符串如何进行增删改查,如何交互实现输入输出,Python运算符的种类等等。

此刻的你,是不是一点也没有感受到程序带来的效率翻倍?

今天就来填补这个大坑,一起来学习分支循环吧!

分支

所谓分支,可以形象的理解为一棵树的分叉:

img

满足哪个条件,就往哪个分叉方向前进。

写成Python伪代码的格式如下:

img

这便是最简单的分支结构:if...else...

还记得之前讲的缩进吗?在这里,:之后按回车键就会自动缩进了,一个缩进相当于按一次Tab

缩进的存在,使得Python代码的可读性更强。

再举两个栗子来练习一下,建议小白同学手动敲一遍:

【栗子1】数字比较

1
2
3
4
5
6
x=1
y=2
if x>y:
print('x比y大!')
else:
print('x比y小!')

输出:

1
x比y小!

【栗子2】年龄验证

1
2
3
4
5
6
7
age=input('请输入你的年龄:')
age=int(age)#input输入的是字符串,所以使用int()将其转为数字类型,你还记的吗
if age>=18:
print('你好!')
print('欢迎光临!')
else:
print('未成年人禁止入内!')

输入18:

1
请输入你的年龄:18你好!欢迎光临!

输入12:

1
请输入你的年龄:12未成年人禁止入内!

需要注意:

:后面缩进的内容是一个整体,比如【栗子2】中的print('你好!')print('欢迎光临!')

但是,如果某一个问题的答案并不是单纯的为**或者**,而是有多于两种的答案,那么上面所讲的if ... else...分支语句就无能为力了。

于是多分支结构出现了!

同样是小树分叉的形式:

img

图中的栗子写成可以运行的Python代码如下:

1
2
3
4
5
6
7
8
9
10
x=input('请输入某同学的考试分数:')
x=int(x)
if x<60:
print('不及格!')
elif x<80:
print('中等')
elif x<90:
print('良好')
else:
print('优秀!')

运行及结果:

1
请输入某同学的考试分数:99优秀!

这种多分支结构采用了elif关键字,它的全称是else if,意思是在否定它上面的条件之后,同时又满足它自身的条件时,就执行它所对应的缩进块内的代码。

在上面的栗子中,假设x=99,我们一起走一遍:

1
2
3
4
5
6
7
检查if语句,发现if后面的x<60不满足,因此跳转到if下面紧邻的第一条elif语句 

检查第1条elif语句(此时由于已经检查了if语句,所以x>=60是默认成立的),发现后面的x<80不满足,因此跳转到第二条elif语句

检查第2条elif语句(此时由于已经检查了第一条elif语句,所以x>=80是默认成立的),发现后面的x<90不满足,因此跳转到最后的else语句

检查最后的else语句(此时由于已经检查了第2条elif语句,所以x>=90是默认成立的),发现x=99满足x>=90这个条件,于是打印'优秀!',程序运行结束。

以上便是基本的分支结构包含的知识点。

这里再说一下嵌套的分支结构,也就是if里面包裹着if,直接上栗子:

1
2
3
4
5
6
x=1
y=2
z=3
if x<y:
if y<z:
print('x<y<z')

输出结果:

1
x<y<z

解释:在第一个if中,满足x,于是继续向下执行第二个if语句(此时已经是在满足x成立的前提下进行的),条件y也满足,于是打印输出x。

你可能也发现了,最后一个条件不必须是else,可以没有,当然也可以是elif。这一点在今后的编程中你将逐渐体会。

循环

Python中,循环有两种,一种是while循环,另一种是for循环。

while循环

while后面跟一个条件表达式,只要条件满足,就一直执行while里面缩进的代码块。举个例栗子:

1
2
3
4
5
6
x=1
sum=0
while x<=10:
sum+=x
x=x+1
print('1+2+...+10=',sum)

这个栗子用来求解110之和。

首先,初始化x1,用于存放求和结果的变量sum被初始化为0

只要条件表达式x<=10满足,那么就一直执行while所包裹的缩进的内容,也就是

1
2
sum+=x
x=x+1

x1开始,每运行一次,x就加1,最终x变为11,此时不再满足条件x<=10,于是退出while循环,打印求和结果,程序运行结束。

for循环

for循环的结构为

1
2
for 迭代变量 in 可迭代对象:
代码块

我们目前所学习到的可迭代对象只有字符串,因此这里便先用字符串举例子了。

1
2
3
word='Python'
for letter in word:
print(letter)

输出

1
2
3
4
5
6
P
y
t
h
o
n

现在来使用for循环求110之和:

1
2
3
4
sum=0
for number in range(1,11):
sum+=number
print('1+2+3+...+10=',sum)

输出

1
1+2+3+...+10= 55

这里使用到了range()函数,它用于生成左闭右开的一个数字序列,具体用法如下:

1
range(start,end,step)

其中,

start:开始的数字

end:结束的数字+1

step:步长

startend必须是整数(可正可负),step无限制

如果不写步长值step,则默认步长为1

如果不写开始值start,默认从0开始 ,此时不能指定step,否则逻辑会出错

看几个栗子:

【栗子1】不写step,则默认为1

1
2
3
x=range(1,4)
for i in x:
print(i)

输出

1
2
3
1
2
3

【栗子2】不写start,默认从0开始

1
2
3
x=range(4)
for i in x:
print(i,end=' ')

输出

1
0 1 2 3 

【栗子3】写step

1
2
3
x=range(4,2,-1)
for i in x:
print(i)

输出

1
2
4
3

你甚至可以像操作字符串那样对range()生成的对象按照下标访问,也可以做切片(只是返回的仍是可迭代对象):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> x=range(1,10) #[1,9]
>>> x[0]
1

>>> x[1]
2

>>> x[8]
9

>>> x[9] #下标越界,所以报错
Traceback (most recent call last): File "<pyshell#22>", line 1, in <module> x[9]IndexError: range object index out of range


#切片
>>> x[1:3]#取下标1到2,注意左闭右开,所以3取不到
range(2, 4)#下标1对应数字2,下标2对应数字3,注意左闭右开,所以数字4取不到

说了这么多,你应该已经很清楚,在求110之和的for循环程序中,range(1,11)得到的是一个从110的可迭代对象。通过for循环,依次取出可迭代对象中的每一个值,加到sum中,最后打印sum即为所求。

break和continue

这两个用于循环中,用来控制循环的走向。

break:直接跳出循环,不再运行循环体内的代码块

continue:只结束本次循环,不会再执行continue语句之后的代码,而是转而从头开始运行循环体内的代码块

举两个栗子来对比这两者:

【栗子1】 break的用法

1
2
3
4
5
6
sum=0
for i in range(1,7):#i从1到6
if i>5:
break #只有在上面的i>5不成立时才执行下面的代码
sum+=i
print(sum)

输出

1
15

解释:当i变为6时,满足if条件,于是执行break语句,跳出整个循环。

所以,上面的代码的作用是求解1+2+3+4+5的和,也就是15

【栗子2】continue的用法

1
2
3
4
5
6
sum=0
for i in range(1,7):#i从1到6
if i==5:
continue#当i=5时,不再执行下面的代码,而是重新开始一次新的循环
sum+=i
print(sum)

输出

1
16

解释:当i=5时,满足if条件,所以会直接进入下一次循环。所以,上面代码的作用就是求解1+2+3+4+6之和,也就是16

补充while循环和for循环的另一种用法:while …else…与for …else …

不管是在while ...else...中,还是在for ...else ...中,只要循环体内的代码是正常执行完之后跳出的循环,那么都会执行else中的代码。但是,如果循环是被break强行终止的,那么抱歉,此时else中的语句会被忽略掉。

这里就以while ...else...为例进行演示:

【栗子1】循环体内没有写break,正常结束循环,于是会执行else中的代码

1
2
3
4
5
6
7
8
9
10
x=1
sum=0
while x<=10:
print('x=',x)
sum+=x
x=x+1
else:
print('x={},x<=10不再满足,即将退出while循环'.format(x))

print('1+2+...+10=',sum)

输出

1
2
3
4
5
6
7
8
9
10
11
12
x= 1
x= 2
x= 3
x= 4
x= 5
x= 6
x= 7
x= 8
x= 9
x= 10
x=11,x<=10不再满足,即将退出while循环
1+2+...+10= 55

【栗子2】循环体内写了break语句,但是break语句并没有被执行,因此也会执行else中的代码

1
2
3
4
5
6
7
8
sum=0
for i in range(1,7):
if sum>100:
break
sum+=i
else:
print('程序正常结束')
print(sum)

输出

1
程序正常结束21

【栗子3】循环体内写了break语句,并且触发了break语句,循环被迫终止,所以此时不会执行else中的代码

1
2
3
4
5
6
7
8
9
sum=0
for i in range(1,7):
if i>5:
break
sum+=i
else:
print('程序正常结束')

print(sum)

输出

1
15