开篇
你可能已经发现,前面的七期内容有一个共同的特点,那就是偏向理论基础,似乎学完之后只是了解了一些实用的方法,比如字符串如何进行增删改查,如何交互实现输入输出,Python
运算符的种类等等。
此刻的你,是不是一点也没有感受到程序带来的效率翻倍?
今天就来填补这个大坑,一起来学习分支和循环吧!
分支
所谓分支,可以形象的理解为一棵树的分叉:
满足哪个条件,就往哪个分叉方向前进。
写成Python
伪代码的格式如下:
这便是最简单的分支结构:if...else...
还记得之前讲的缩进吗?在这里,:
之后按回车键就会自动缩进了,一个缩进相当于按一次Tab
键
缩进的存在,使得Python
代码的可读性更强。
再举两个栗子来练习一下,建议小白同学手动敲一遍:
【栗子1】数字比较
x=1
y=2
if x>y:
print('x比y大!')
else:
print('x比y小!')
输出:
x比y小!
【栗子2】年龄验证
age=input('请输入你的年龄:')
age=int(age)#input输入的是字符串,所以使用int()将其转为数字类型,你还记的吗
if age>=18:
print('你好!')
print('欢迎光临!')
else:
print('未成年人禁止入内!')
输入18:
请输入你的年龄:18
你好!
欢迎光临!
输入12:
请输入你的年龄:12
未成年人禁止入内!
需要注意::
后面缩进的内容是一个整体,比如【栗子2】中的print('你好!')
和print('欢迎光临!')
但是,如果某一个问题的答案并不是单纯的为是
或者否
,而是有多于两种的答案,那么上面所讲的if ... else...
分支语句就无能为力了。
于是多分支结构
出现了!
同样是小树分叉的形式:
图中的栗子写成可以运行的Python
代码如下:
x=input('请输入某同学的考试分数:')
x=int(x)
if x<60:
print('不及格!')
elif x<80:
print('中等')
elif x<90:
print('良好')
else:
print('优秀!')
运行及结果:
请输入某同学的考试分数:99
优秀!
这种多分支结构采用了elif
关键字,它的全称是else if
,意思是在否定它上面的条件之后,同时又满足它自身的条件时,就执行它所对应的缩进块内的代码。
在上面的栗子中,假设x=99
,我们一起走一遍:
检查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
,直接上栗子:
x=1
y=2
z=3
if x if y print('x)
输出结果:
x
解释:在第一个if
中,满足x,于是继续向下执行第二个if语句(此时已经是在满足x成立的前提下进行的),条件
y也满足,于是打印输出
x。
你可能也发现了,最后一个条件不必须是else
,可以没有,当然也可以是elif
。这一点在今后的编程中你将逐渐体会。
循环
在Python
中,循环有两种,一种是while
循环,另一种是for
循环。
while循环
while
后面跟一个条件表达式,只要条件满足,就一直执行while里面缩进的代码块。举个例栗子:
x=1
sum=0
while x<=10:
sum+=x
x=x+1
print('1+2+...+10=',sum)
这个栗子用来求解1
到10
之和。
首先,初始化x
为1
,用于存放求和结果的变量sum
被初始化为0
。
只要条件表达式x<=10
满足,那么就一直执行while
所包裹的缩进的内容,也就是
sum+=x
x=x+1
x
从1
开始,每运行一次,x
就加1
,最终x
变为11
,此时不再满足条件x<=10
,于是退出while
循环,打印求和结果,程序运行结束。
for循环
for
循环的结构为
for 迭代变量 in 可迭代对象:
代码块
我们目前所学习到的可迭代对象只有字符串,因此这里便先用字符串举例子了。
word='Python'
for letter in word:
print(letter)
输出
P
y
t
h
o
n
现在来使用for
循环求1
到10
之和:
sum=0
for number in range(1,11):
sum+=number
print('1+2+3+...+10=',sum)
输出
1+2+3+...+10= 55
这里使用到了range()
函数,它用于生成左闭右开的一个数字序列,具体用法如下:range(start,end,step)
其中,
start
:开始的数字end
:结束的数字+1step
:步长
start
和end
必须是整数(可正可负),step
无限制
如果不写步长值step
,则默认步长为1
如果不写开始值start
,默认从0
开始 ,此时不能指定step
,否则逻辑会出错
看几个栗子:
【栗子1】不写step
,则默认为1
x=range(1,4)
for i in x:
print(i)
输出
1
2
3
【栗子2】不写start
,默认从0
开始
x=range(4)
for i in x:
print(i,end=' ')
输出
0 1 2 3
【栗子3】写step
x=range(4,2,-1)
for i in x:
print(i)
输出
4
3
你甚至可以像操作字符串那样对range()
生成的对象按照下标访问,也可以做切片(只是返回的仍是可迭代对象):
>>> x=range(1,10) #[1,9]
>>> x[0]
1
>>> x[1]
2
>>> x[8]
9
>>> x[9] #下标越界,所以报错
Traceback (most recent call last):
File "", line 1, in
x[9]
IndexError: range object index out of range#切片
>>> x[1:3]#取下标1到2,注意左闭右开,所以3取不到
range(2, 4)#下标1对应数字2,下标2对应数字3,注意左闭右开,所以数字4取不到
说了这么多,你应该已经很清楚,在求1
到10
之和的for
循环程序中,range(1,11)
得到的是一个从1
到10
的可迭代对象。通过for
循环,依次取出可迭代对象中的每一个值,加到sum
中,最后打印sum
即为所求。
break和continue
这两个用于循环中,用来控制循环的走向。
break
:直接跳出循环,不再运行循环体内的代码块
continue
:只结束本次循环,不会再执行continue
语句之后的代码,而是转而从头开始运行循环体内的代码块
举两个栗子来对比这两者:
【栗子1】 break
的用法
sum=0
for i in range(1,7):#i从1到6
if i>5:
break
#只有在上面的i>5不成立时才执行下面的代码
sum+=i
print(sum)
输出
15
解释:当i
变为6
时,满足if
条件,于是执行break
语句,跳出整个循环。
所以,上面的代码的作用是求解1+2+3+4+5
的和,也就是15
。
【栗子2】continue
的用法
sum=0
for i in range(1,7):#i从1到6
if i==5:
continue#当i=5时,不再执行下面的代码,而是重新开始一次新的循环
sum+=i
print(sum)
输出
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
中的代码
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)
输出
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
中的代码
sum=0
for i in range(1,7):
if sum>100:
break
sum+=i
else:
print('程序正常结束')
print(sum)
输出
程序正常结束
21
【栗子3】循环体内写了break
语句,并且触发了break
语句,循环被迫终止,所以此时不会执行else
中的代码
sum=0
for i in range(1,7):
if i>5:
break
sum+=i
else:
print('程序正常结束')
print(sum)
输出
15