程序的流程控制
零、程序的结构
- 分为三种结构
- 顺序结构:自顶向下运行代码;
- 分支结构(选择结构):通过条件的判断进行代码分支的处理,如果条件成功,则执行指定的代码块。只执行0次或1次;
- 循环结构:通过条件的判断,如果条件为真则执行代码,这个判断会进行多次,直到条件为假。执行的次数比判断次数少一次。
- 分支结构的关键字:
if
、elif
、else
,只有一种分支的语法; - 循环结构的关键字:
while
、for-in
,有两种循环语法
一、对象的布尔值
在Python一切皆对象,每个对象都有一个布尔值(True
或者False
)。
- 以下对象的布尔为
False
,其余的对象的布尔值为True
:
0
0.0
False
None
''
:空字符串[]
:空列表{}
:空字典()
:空元组set()
:空集合
- 如何判断对象的布尔值:使用
bool(obj)
print(bool(0))
print(bool(0.0))
print(bool(False))
print(bool(None))
print(bool([]))
print(bool({}))
print(bool(()))
print(bool(set()))
''' 以上代码的输出结果均为False '''
二、分支结构
2.1 单分支
- 语法
if 条件: # 条件的布尔值,不需要使用bool()来获取
如果条件为True则执行代码1
如果条件为True则执行代码2
无论条件是否成立,这行代码肯定执行
关键字
if
会自动判断条件的布尔值,不必使用bool()
函数。
- 代码
# 需求:坐公交车,如果钱大于6元,才乘坐公交
# 1. 请用户进行刷卡,相当于用户输入一个余额
balance = input('请刷卡,余额为:')
# 2. 判断余额,如果余额大于等于6元,则可以乘车
if balance >= 6:
print('请上车')
# 3. 标记,刷卡结束
print('刷卡结束')
2.2 双分支
- 语法
if 条件:
代码1
...
else: # 不做判断,如果if后的条件为False,则执行else的代码块
代码2
...
- 案例
# 需求:乘坐公交,加需求:当余额小于6元时,打印“请步行回家”
balance = int(input('请刷卡,余额为:'))
# 判断余额,如果余额大于等于6元,则可以乘车
if balance >= 6:
print('请上车')
else:
print('请步行回家!')
# 3. 标记,刷卡结束
print('刷卡结束')
- 随堂练习
''' 练习:
一个人想去网吧上网:
如果年龄大于18岁,则可以上网;
否则,不能上网。
'''
age = int(input('请出示身份证,年龄为:'))
if age >= 18:
print('可以上网')
else:
print('不能上网')
2.3 多分支
- 语法
if 条件1:
代码1...
elif 条件2:
代码2...
elif 条件3:
代码3...
else:
代码n...
- 案例1
如果 余额大于等于4元,则打印请上车;
如果 余额大于2元,则请充值;
如果 余额小于2元,请投币。
balance = int(input('请刷卡,余额为:'))
if balance >= 4:
print('请上车')
elif balance >= 2:
print('请充值')
elif balance >= 0:
print('请投币')
- 案例2
如果 余额大于等于4元,则打印请上车;
如果 余额大于2元,则请充值;
如果 余额小于2元,请投币;
如果以上条件不满足,比如拿错了卡,提示请查看卡片(代码中表示为小于0)。
balance = int(input('请刷卡,余额为:'))
print('开始')
if balance >= 4:
print('请上车')
elif balance >= 2:
print('请充值')
elif balance >= 0:
print('请投币')
else: # balance 小于0 才执行
print('拿错了卡,请查看卡片')
print('结束 ')
- 随堂练习
买东西。需要计算最终的付款金额!
如果消费金额大于等于500元,则打8折
如果消费金额大于等于300小于500,则打8.5折
如果消费金额大于等于200小于300,则打9折
如果消费金额小于200,不打折
money = int(input('请输入消费金额:'))
if money >= 500:
money *= 0.8
elif money >= 300:
money *= 0.85
elif money >=200:
money *= 0.9
elif money > 0:
pass
else:
print('你没有消费')
print(f'您最终的消费金额为:{money}')
2.4 if嵌套
- 案例1
查看考试成绩:
70分以上为及格,70分以下为不及格
如果85分以上,等级为A
如果70-85分,等级为B
如果60-70分,等级为C
如果60分以下,等级为D
score = int(input('请输入你的成绩:'))
if score >= 70:
print('及格')
if score >= 85:
print('等级A')
else:
print('等级B')
else:
print('不及格')
if score >= 60:
print('等级C')
else:
print('等级D')
- 案例2
如果余额大于等于4元,则打印请上车;否则步行;
加需求:上车后,如果有座位则坐下,否则站着。
balance = int(input('请刷卡,余额为:'))
if balance >= 4:
print('请上车')
# 请问司机是否有座位?
seat = input('请问是否有座位?(Y/n):')
if seat == 'Y':
print('有座位,请坐!')
elif seat == 'n':
print('没座位,先站着!')
else:
print('没听清')
else:
print('步行')
2.5 三目表达式
提示用户输入两个整数,判断两个整数的大小,将较大的数字输出到控制台!
- 使用
if..else...
num1 = int(input('请输入第一个整数:'))
num2 = int(input('请输入另一个整数:'))
if num1 > num2:
print(f'较大数为:{num1}')
else:
print(f'较大数为:{num2}')
- 使用三目表达式
num1 = int(input('请输入第一个整数:'))
num2 = int(input('请输入另一个整数:'))
# 三目表达式
max_num = num1 if num1 > num2 else num2
print(f'较大的数为{max_num}')
2.6 补充
score = 65
if score >= 85:
print('A')
elif 85 > score >= 70: # 70 < score <= 85
print('B')
elif 60 <= score < 70: # 60 <= score < 70
print('C')
else:
print('D')
Python
支持数学中的连续比较运算符:11 <= 变量 < 22
三、range()
3.1 语法
range(stop) -> range object
range(start, stop[, step]) -> range object
参数解释:
start
:开始数字,包含;
stop
:结束数字,不包含;
step
:步长。正负整数均可,如果为负数,表示从开始数字向负方向迭代。
r = range(3)
print(r, type(r)) # range(0, 3) <class 'range'>
range()
返回一个range
对象,是一个可迭代对象
3.2 range(stop)
# 如何查看 range() 中的元素
r = range(3)
print(list(r)) # [0, 1, 2]
range(stop)
中默认:start=0
、step=1
3.3 range(start, stop[, step])
range(start, stop)
# range(start, stop)
print(list(range(2, 5))) # [2, 3, 4]
print(list(range(5, 2))) # []
# 打印 -3到2 的列表
print(list(range(-3, 3)))
print(list(range(3, -3))) # []
range(start, stop)
中默认:step=1
range(start, stop, step)
# 打印 0-9 的所有偶数的列表
print(list(range(0, 10, 2)))
# 打印 0-9 的所有奇数的列表
print(list(range(1, 10, 2)))
# 打印 3到-2 的数字列表
print(list(range(3, -3, -1))) # [3, 2, 1, 0, -1, -2]
step
为负数时,迭代方向为反方向。
四、循环结构
4.1 while
- 语法
while 条件:
循环体
- 一般形式
防止出现死循环,满足以下三个条件
# 1. 起始值
while 条件: # 2. 判断这个起始值
循环体(多行语句)
# 3. 改变起始值
- 案例1:循环输出0-9之间的所有整数,要求在一行打印。
a = 0
while a < 10:
print(a, end='\t')
a += 1
- 案例2:循环输出9-0之间的所有整数,要求在一行打印。
a = 9
while a >=0:
print(a, end='\t')
a -= 1
- 案例3:使用while打印0-9之间的所有偶数
# 第一种方案:
a = 0
while a < 10:
print(a, end='\t')
a += 2 # 通过改变a的增量
# 第二种方案:
a = 0
while a < 10:
if not a % 2: # 判断一个整数为偶数
print(a, end='\t')
a += 1
- 案例4:求出0-99所有整数的和
''' 分析过程:
a=0 sum_ = 0 + 0 = 0
a=1 sum_ = 0 + 1 = 1
a=2 sum_ = 1 + 2 = 3
a=99 sum_ = 4851 + 99 = 最终结果 = 4950
'''
a = 0
sum_ = 0 # 设置一个保存整数和的变量,不能影响到a的0-99的和
while a < 100:
# 在循环体中累积求和
sum_ += a # sum_ = sum_ + a
a += 1
# 打印最终结果
print(sum_)
4.2 for
- 语法
for 变量 in 可迭代的对象: # 目前已学过的可迭代对象有:str、range
循环体
- 案例1:打印0-9所有整数
# 第一种:使用字符串
for tmp in '0123456789':
print(int(tmp))
# 第二种:使用range()
for i in range(10):
print(i)
- 案例2:打印0-9之间的所有奇数
# 第一种:使用range的步长
for i in range(1, 10, 2):
print(i, end=' ')
print()
# 第二种:使用if判断余数
for i in range(10):
if i % 2:
print(i, end=' ')
- 案例3:求0-99之间整数的奇数和与偶数和
sum1 = 0 # 保存奇数的和
sum2 = 0 # 保存偶数的和
# while a < 100:
for a in range(100):
if a % 2:
sum1 += a
else:
sum2 += a
- 扩展
如果
for
之后的变量在循环体中没使用,建议使用_
作为变量名!
# 需求:使用for-in打印“我中了500万”5遍
for _ in range(5):
print('我中了500万')
4.3 break
break
在循环中的作用是,跳出循环,执行循环之后的代码;break
一旦执行,break
之后的循环体代码不会执行;
- 案例1:遍历0-9之间的整数,只打印0-4,5-9不打印。
# 第一种:先打印,后判断
for i in range(10):
print(i, end=' ')
if i == 4:
break
# 第二种:先判断,后打印
for i in range(10):
if i == 5:
break
print(i, end=' ')
- 案例2:猜0-999数字
电脑随机生成0-999的数字,使用程序提示用户输入自己猜的内容,如果猜错继续猜,直到猜中为止;
- 如果用户的数字大于电脑数字,则给出提示“大了,再猜!”;
- 如果用户的数字小于电脑数字,则给出提示“小了,再猜!”;
- 如果用户的数字等于电脑数字,则给出提示“中了,Bye!”,跳出循环;
import random
# 电脑随机生成一个 0-999的数字,包含0和999
cmp = random.randint(0, 999)
# 判断用户猜的数字与电脑的随机数是否相等
while True: # 为什么使用while?因为猜的次数未知
player = int(input('请猜:')) # 这一句必须放在循环中,不然无法猜第二次
if player > cmp:
print('大了,再猜!')
elif player < cmp:
print('小了,再猜!')
else:
print('中了,再见!')
break
- 案例3:加需求,限制用户猜的次数最多3次
import random
cmp = random.randint(0, 999)
for _ in range(3);
player = int(input('请猜:'))
if player > cmp:
print('大了,再猜!')
elif player < cmp:
print('小了,再猜!')
else:
print('中了,再见!')
break
4.4 else
在
while
或者for
循环之后,如果有else
语句,并且循环体内有break
;
- 当执行
break
后,则不执行else
中的代码;- 如果循环正常结束(不执行
break
而结束循环),则执行else
中的代码
- 语法
for 变量 in 可迭代对象:
循环体
break # 如果执行break,那么else不执行
else: # 如果以上循环正常结束,则执行else
代码
- 案例
加需求:
- 如果三次机会使用完,请打印“三次机会已用完,你真菜!”
- 无论用户是否猜中,猜完之后打印“游戏结束”
import random
cmp = random.randint(0, 999)
for _ in range(3):
player = int(input('请猜:'))
if player > cmp:
print('大了,再猜!')
elif player < cmp:
print('小了,再猜!')
else:
print('中了,再见!')
break
else:
print('三次机会已用完,你真菜!!!')
print('游戏结束!')
4.5 continue
关键字
continue
表示,当执行continue
时,结束当前循环,继续进行下次循环;一旦执行
continue
,continue
之后的循环体代码不执行,跳到下次循环。
- 案例:遍历
HelloPython
,不打印o
str_ = 'HelloPython'
for tmp in str_:
if tmp == 'o':
continue
print(tmp, end='')
- 随堂练习
# 打印0-9偶数,使用continue
for i in range(10):
if i % 2:
continue
print(i, end=' ')
4.6 循环的嵌套
- 案例1:打印一个4行3列的矩形
''' 结果:
* * *
* * *
* * *
* * *
'''
''' 分析:
第一行,打印三个星
第二行,打印三个星
第三行,打印三个星
提取信息:
1. 将一个星在一行打印三次
2. 将“一行三个星”打印三行,即可。
'''
for j in range(4): # 行
for i in range(3): # 列
print('*', end='\t')
print()
- 案例2:打印一个直角三角形
'''
*
* *
* * *
* * * *
'''
''' 分析:
第一行打印一颗星;
第二行打印二颗星;
第三行打印三颗星;
第四行打印四颗星;
'''
for i in range(1, 5):
for j in range(1, i+1):
print('*', end='\t')
print()
- 随堂练习:打印九九乘法表
for i in range(1, 10):
for j in range(1, i+1):
print(f'{j}*{i}={i*j}', end='\t')
print()