流程控制
引子
流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:顺序结构(之前我们写的代码都是顺序结构)、分支结构(用到if判断)、循环结构(用到while与for)
一、顺序结构
就是自上而下的执行
二、分支结构
2.1 概念
2.1.1 什么是分支结构
分支结构就是根据条件判断的真假去执行不同分支对应的子代码
2.1.2 为什么要用分支结构
人类某些时候需要根据条件来决定做什么事情,比如:如果今天下雨,就带伞
所以程序中必须有相应的机制来控制计算机具备人的这种判断能力
2.2 单if语法
我们可以把整个if语句看成一个完整的代码块
语法格式如下:
if 要判断条件:
条件成立时,要做的事情
......
案例1:
如果年龄< 25,那么:叫小姐姐
age = 27
if age < 25:
print('小姐姐')
# 无论条件是否满足都会执行
print('这行代码什么时候执行?')
2.3 双分支结构
语法格式:
if 判断条件:
条件成立执行的子代码块
else:
条件不成立执行的子代码块
案例2:
如果年龄< 25,那么:叫小姐姐,否则:叫大姐姐
age = 30
if age < 25:
print('小姐姐')
else:
print('大姐姐')
2.4 多分支结构
语法格式:(else语句是可有可无的)
if 条件1:
条件1成立执行的子代码块
elif 条件2:
条件1不成立条件2成立执行的子代码块
elif 条件3:
条件1、2不成立条件3成立执行的子代码块
elif 条件4:
条件1、2、3不成立条件4成立执行的子代码块
else:
以上条件都不成立的时候执行的代码块
案例3:
如果:成绩>=90,那么:优秀
如果成绩>=80且<90,那么:良好
如果成绩>=70且<80,那么:普通
如果成绩>=60且<70,那么:及格
其他情况:不及格
score = 56
if score >= 90:
print('优秀')
elif score >=80:
print('良好')
elif score >=70:
print('一般')
elif score >=60:
print('及格')
else:
print('不及格')
2.5 if判断之嵌套
案例4:
age = 18
height = 1.6
weight = 90
is_beautiful=True
is_success=True
if age < 20 and height == 1.6 and weight<100 and is_beautiful:
print('给个微信呗!!!')
'''要么给,要么不给'''
if is_success:
print('吃饭 看电影...')
else:
print('慢走不送!!!')
else:
print('好吧')
练习1:登录功能
写一个登录功能,用户名是:kevin 密码是:123
# 要求:用户名和密码输入正确,打印登录成功,否则登录失败
username=input('username:>>>')
password=input('password:>>>')
if username == 'kevin' and password == '123':
print('登录成功')
else:
print('登录失败')
练习2. 根据用户名的不同打印不同的身份
kevin:管理员 jack:保安 tom:保洁 tank:销售 其余的都是普通人
username = input('请输入你的名字:>>>')
if username == 'kevin':
print('管理员')
elif username == 'jack':
print('保安')
elif username == 'tom':
print('保洁')
elif username == 'tank':
print('销售')
else:
print('普通人')
三、循环结构
3.1 概念
3.1.1 什么是循环结构
循环结构就是重复执行某段代码块
3.1.2 为什么要用循环结构
人类某些时候需要重复做某件事情
所以程序中必须有相应的机制来控制计算机具备人的这种循环做事的能力
3.2 while循环
3.2.1 while循环语法
while语法格式
while 条件:
循环体
while语法格式(带有计数器)
初始条件设置——通常是重复执行的 计数器
while 条件(判断 计数器 是否达到 目标次数):
条件1满足时,执行的子代码块
条件2满足时,执行的子代码块
......
处理条件(计数器+1)
案例1:
打印 5 遍 Hello Python
# 1.定义一个整数变量,记录循环次数
i = 1
# 2.开始循环
while i<=5:
# 1>希望在循环内执行的代码
print('Hello Python')
# 2>处理计数器
i = i + 1
案例2:
显示登录成功或者失败
while True:
username=input('username:>>>')
password=input('password:>>>')
if username == 'kevin' and password == '123':
print('登录成功')
else:
print('登录失败')
3.2.2 while+break
while+break的使用
又出现了一个问题,用户输入正确的用户名密码以后无法结束循环,那如何结束掉一个循环呢?这就需要用到break了!
break 某一条件满足时,退出循环,不在执行后续重复的代码,只针对当前所在循环有效
案例3:
# break的应用,退出本循环
i = 0
while i < 5:
# break 某一条件满足时,退出循环,不在执行后续重复的代码
if i == 3:
break
print(i)
i += 1
# count = 0
while True:
username=input('username:>>>')
password=input('password:>>>')
if username == 'kevin' and password == '123':
print('登录成功')
break # 结束本层循环
else:
print('登录失败')
break本层含义:结束本层循环
如果while循环嵌套了很多层,要想退出每一层循环则需要在每一层循环都有一个break
案例4:
while True: # 第一层循环
username=input('username:>>>')
password=input('password:>>>')
if username == 'kevin' and password == '123':
print('欢迎光临')
while True: # 第二层循环
cmd=input('请输入你的指令:>>>')
if cmd == 'q':
# 结束程序
break # 用于结束本层循环,即第二层循环
print('正在执行你的指令:%s' % cmd)
break # 用于结束本层循环,即第一层循环
else:
print('登录失败')
print(123)
3.2.3 标志位的使用
可以不使用break来一层一层终止循环,直接定义一个标志位(变量)来结束循环
针对嵌套多层的while循环,如果我们的目的很明确就是要在某一层直接退出所有层的循环,其实有一个窍门,就让所有while循环的条件都用同一个变量,该变量的初始值为True,一旦在某一层将该变量的值改成False,则所有层的循环都结束
案例5:
flag = True
while flag:
username=input('username:>>>')
password=input('password:>>>')
if username == 'kevin' and password == '123':
print('欢迎光临')
while flag:
cmd=input('请输入你的指令:>>>')
if cmd == 'q':
# 结束程序
flag = False # flag变为False, 所有while循环的条件都变为False
print('正在执行你的指令:%s' % cmd)
else:
print('登录失败')
3.2.4 while+continue
break代表结束本层循环,而continue则用于结束本次循环,直接进入下一次循环
案例6:
# 1. 使用循环打印出0-9的数字
i=0
while i < 10:
print(i)
i += 1
# 2. 打印0-10的数字不打印6
count=0
while count < 11:
if count ==3:
count+=1
continue
print(count)
count+=1
'''
continue结束本次循环,(结束count是3时的输出)并且回到while循环的条件处从新判断,继续增加计数
break结束本层循环,之后本层的计数不再增加
'''
# 注意:continue出现就代表结束本次的循环,本次后面的代码不会执行,所以计数赋值必须写在continue的前面
3.2.5 while+else(了解)
在while循环的后面,我们可以跟else语句,当while 循环正常执行完并且中间没有被break 中止的话,就会执行else后面的语句,所以我们可以用else来验证,循环是否正常结束
案例7:
count = 0
while count < 5:
print(count)
count += 1
else:
print('哈哈哈哈')
如果执行过程中被break,就不会执行else的语句
count = 0
while count < 5:
if count == 2:
count += 1
break
print(count)
count += 1
else:
print('哈哈哈哈')
当while循环没有被中断(break)的时候,就会执行else
count = 0
while count < 5:
if count == 2:
count += 1
continue
print(count)
count += 1
else:
print('哈哈哈哈')
3.2.6 死循环
死循环就是循环一直在运行,不会停止。在程序中,可千万不能出现死循环。然而while特别容易出现死循环,所以之后能用for循环实现的,都不要使用while循环
while True:
print(100)
练习1:
猜年龄的游戏
1、普通要求:只允许输错3次,输入正确直接结束
2、当输错3次之后,不要直接结束,问用户是否还要在次输入,如果要,继续输入,如果不要,直接结束
我自己写的:
count = 0
while count < 3:
age = int(input('猜猜我的年龄:'))
if age == 20:
print('猜测正确')
break
else:
print('猜错了,请重新输入')
count += 1
if count == 3:
qqq = input('请问,是否需要再次输入:yes/no')
if qqq == 'yes':
count = 0
else:
break
老师讲解:
# 先写主体功能
# 1. 先定义一个年龄出来
real_age = 18
# 定义一个计数器
count = 1
while count < 4:
# 2. 用户输入年龄
guess_age = input('请输入你猜测的年龄:>>>') # 数字
# 2.1 把字符串的数字转为整型,int,可能会出现bug
guess_age = int(guess_age)
# 3. 判断输入的年龄和真实年龄是否一样
if guess_age > real_age:
print('猜大了')
# count+=1
elif guess_age < real_age:
print('猜小了')
# count+=1
else:
print('哎呀,猜对了')
break
# 优化
count+=1
'''拔高'''
# 1. 先定义一个年龄出来
real_age = 18
# 定义一个计数器
count = 1
while count < 4:
# 2. 用户输入年龄
guess_age = input('请输入你猜测的年龄:>>>') # 数字
# 2.1 把字符串的数字转为整型,int,可能会出现bug
guess_age = int(guess_age)
# 3. 判断输入的年龄和真实年龄是否一样
if guess_age > real_age:
print('猜大了')
# count+=1
elif guess_age < real_age:
print('猜小了')
# count+=1
else:
print('哎呀,猜对了')
break
# 优化
count+=1
if count == 4:
# 询问:是否再次输入
cmd = input('三次机会使用完了,是否再次输入yes/no')
if cmd == 'yes':
count=1
else:
print('结束')
break
如果不知道怎么进行,就先写主体功能,然后一步步拓展,要记得加上注释。
3.3 for循环
循环结构的第二种实现方式是for循环,for循环可以做的事情while循环都可以实现,之所以用for循环是因为在循环取值(即遍历值)时,while循环非常容易出现死循环的情况,而for循环不会出现死循环,所以推荐使用for循环
3.3.1 for循环语法
语法格式:
for 变量 in 可迭代对象: 字符串、列表、字典、元组
print(name)
for后面的变量名命名的时候,如果没有特殊的含义,我们一般使用i,j,k,v,item等等
案例1:
# 1. 使用while循环打印以下列表中得数据
name_list = ['kevin', 'tony', 'jack', 'tom']
#while循环中如果列表中字符串个数改变,就必须改判断条件值,比较麻烦
# 列表取值是用索引
i=0
while i<4:
print(name_list[i])
i+=1
# 用for循环比较简单
for name in name_list:
print(name)
案例2:
# 字符串
for i in 'hello world':
print(i) # 空格也是一个字符串
# 列表
name_list = ['kevin', 'tony', 'jack', 'tom']
for name in name_list:
print(name)
# 元组
for j in (45, 24, 'tom'):
print(j)
'''重点'''
# 字典,暴露在外面的是K
d = {'username': 'kevin', 'age': 18, 'hobby': 'music'}
for i in d:
print(i, d[i])
print(i, d[i], sep=':')
3.3.2 range关键字
range(start, stop, step),配合for循环使用
案例3:
#第一种用法:
for i in range(10): # 一个参数, 打印数字列表,从0开始
print(i)
#第二种用法:
for i in range(4, 18): # 顾头不顾尾[4,18)
print(i)
#第三种用法:
for i in range(2, 20, 3):# 步长:即间隔 # 顾头不顾尾
print(i)
拓展知识
"""
推断:https://movie.douban.com/top250?start=0&filter= 第一页
https://movie.douban.com/top250?start=25&filter= 第二页
https://movie.douban.com/top250?start=50&filter= 第三页
https://movie.douban.com/top250?start=75&filter= 第四页
https://movie.douban.com/top250?start=100&filter= 第五页
...
https://movie.douban.com/top250?start=225&filter= 第十页
"""
url = 'https://movie.douban.com/top250?start=%s&filter='
for i in range(0, 250, 25):
print(url % i)
补充:range在不同解释器版本中是有区别的
python2.x解释器是以列表形式输出,所有元素都写出
python3.x解释器是直接输出range(1,10,3),只有赋值或调用才会提取里面的元素
3.3.3 for+break
案例4:
for i in range(10):
if i == 3:
break
print(i)
3.3.4 for+continue
案例5:
for i in range(10):
if i == 3:
continue
print(i)
3.3.5 for+else
案例6:
for i in range(10):
if i == 3:
break
print(i)
else:
print('哈哈哈哈')
3.3.6 for循环嵌套
案例7:
for i in range(1, 10):
for j in range(1, i + 1):
print('%s * %s = %s' % (j, i, i*j), end=' ')
print()