第四章 Python程序的流程控制
程序的组织结构
顺序结构
顺序结构:按程序语句的自然顺序,从上到下,以此执行每条语句的程序。
# 赋值运算符的顺序:从右到左
name = '张三'
age = 20
a = b = c = d = 100 # 链式赋值
a, b, c, d = 'room' # 字符串分解赋值 ---> a=r,b=o,c=o,d=m
print(a, b, c, d)
选择结构
单分支if
单分支结构 if 的语法结构:
if 表达式 :
语句块
注意冒号和下一行的缩进是非常重要的(在Python中是通过冒号和缩进来控制程序逻辑的)。
number = eval(input('请输入您的6位中奖号码:'))
# 使用if语句
if number == 123456:
print('恭喜您中奖了!')
if number != 123456:
print('您未中本期大奖')
n = 98 # 赋值操作
if n % 2: # 98%2的余数是0,0的布尔值是False,非0的布尔值为True
print(n, '是奇数') # 由于98%2的余数是0,所以该行代码不执行
if not n % 2: # 98%2的余数是0,0的布尔值是False,not False的结果为True
print(n, '为偶数')
print('-------判断一个字符串是否是空字符串--------')
x = input('请输入一个字符串:')
if x: # 在Python中一切皆对象,每个对象都有一个布尔值,而非空字符串的布尔值为True,空字符串的布尔值为False
print('x是一个非空字符串')
if not x: # 非空字符串的布尔值为True,取反,not False的结果为True
print('x是一个空字符串')
print('-------表达式也可以是一个单纯的布尔型变量--------')
flag = eval(input('请输入一个布尔类型的值:True或False'))
if flag:
print('flag的值为True')
if not flag:
print('flag的值为False')
print('-------使用if语句时,如果语句中只有一句代码,可以将语句块直接写在冒号的后面--------')
a = 10
b = 5
if a > b: max = a # 语句块只有一句
print('a和b的最大值为:', max)
双分支if else
双分支结构 if…else… 的语法结构:
if 表达式 :
语句1
else :
语句2
number = eval(input('请输入您的6位中奖号码:'))
# if...else...
if number == 123456:
print('恭喜您中奖了!')
else:
print('您未中本期大奖')
print('---以上代码可以使用条件表达式进行简化---')
result = '恭喜您中奖了!' if number == 123456 else '您未中本期大奖'
print(result)
print('恭喜您中奖了!' if number == 123456 else '您未中本期大奖')
# 条件表达式:判断条件结果为True,执行if之前的语句,结果为False,就执行else之后的语句
多分支结构
多分支结构的语法结构:(其中else语句可有可无)
if 表达式1 :
语句块1
elif 表达式2 :
语句块2
elif 表达式n :
语句块n
else :
语句块n+1
score = eval(input('请输入您的成绩:'))
# 多分支结构
if score < 0 or score > 100:
print('成绩有误!')
elif 0 <= score < 60:
print('E')
elif 60 <= score < 70:
print('D')
elif 70 <= score < 80:
print('C')
elif 80 <= score < 90:
print('B')
else:
print('A')
嵌套if
单分支结构、双分支结构和多分支结构在实际开发中是可以相互嵌套使用的,内层的分支结构将作为外层分支结构的语句块使用。
answer = input('请问您喝酒了吗?')
if answer == 'y': # answer的值为y表示喝酒了
proof = eval(input('请输入酒精含量:'))
if proof < 20:
print('构不成酒驾')
elif proof < 80: # 20<=proof<80
print('已构成酒驾')
else: # 80<=proof
print('已构成醉驾')
else:
print('你走吧,没你啥事!')
多个条件的连接
在使用 and 连接多个条件判断时,只有同时满足多个条件,才能执行if后面的语句块。
user_name = input('请输入您的用户名:')
pwd = input('请输入您的密码:')
if user_name == 'zhong' and pwd == '123456':
print('登录成功')
else:
print('用户名或密码不正确')
使用 or 连接多个判断条件时,只要满足多个条件中的一个,就可以执行if后面的语句块。
score = eval(input('请输入你的成绩:'))
if score < 0 or score > 100:
print('成绩无效')
else:
print('你的成绩为:', score)
模式匹配
在 Python 3.11 增加了模式匹配
功能,虽然在Python中没有其他编程语言中switch这种表达式的结构,但是模式匹配
功能相当于是switch的加强版。
score=input('请输入成绩等级:')
match score:
case 'A':
print('优秀')
case 'B':
print('良好')
case 'C':
print('中等')
case 'D':
print('及格')
case 'E':
print('不及格')
循环结构
for循环
遍历循环for的语句结构:
for 循环变量 in 遍历对象:
语句块
有点要说明一下,在Python中 // 是整除,而 / 不是整除。且在Python中有幂运算符 ** 。
range()函数:
来源:
# 遍历字符串
for i in 'hello':
print(i)
# range()函数,Python中的内置函数,产生一个[n,m)的整数序列,包含n,但是不包含m
for i in range(1,11):
if i%2==0:
print(i,'是偶数')
# 计算1-10之间的累加和
s=0 # 用于存储累加和
for i in range(1,11):
s+=i # 相当于s=s+i
print('1-10之间的累加和:',s)
'''
计算100-999之间的水仙花数。
水仙花数是指一个 3 位数,它的每个数位上的数字的 3次幂之和等于它本身。 例如:1^3 + 5^3+ 3^3 = 153
'''
for i in range(100,1000):
sd=i%10 # 获取个位上的数,如153%10 --> 3
tens=i//10%10 # 获取十位上的数,如153//10 --> 15%10 --> 5
hundred=i//100 # 获取百位上的数,如153//100 --> 1
# 有点要说明一下,在Python中 // 是整除,而 / 不是整除。且在Python中有幂运算符**
if sd**3 + tens**3 + hundred**3 == i:
print(i,'是水仙花数')
for…else…结构:
for 循环变量 in 遍历对象:
语句块1
else
语句块2
else语句只有在循环正常结束之后才会执行,在循环中遇到了break这种叫不正常的,遇到break叫非正常终止循环。(循环要执行10次,但执行5次后便退出了,这是非正常;循环要执行10次,最终执行10次,这是正常)
s=0 # 用于存储累加和
for i in range(1,11):
s+=i
else:
print('1-10之间的累加和:',s)
# 在这个循环中没有遇到中断情况,循环正常结束,因此会执行else
while循环
无限循环while的语句结构:
while 表达式:
语句块
while循环的四个步骤:
1、初始化变量
2、条件判断
3、语句块
4、改变变量
值得注意的是一般来说1、2、4中的变量指的都是同一个变量。
# (1)初始化变量
answer=input('今天要上课吗? y/n')
while answer=='y': # (2)条件判断
print('好好学习,天天向上') # (3)语句块
# (4)改变变量
answer=input('今天要上课吗? y/n')
# 1-100之间的累加和
s=0 # 存储累加和
i=1 # (1)初始化变量
while i<=100: # (2)条件判断
s+=i # (3)语句块
# (4)改变变量
i+=1 #相当于i=i+1
print('1-100之间的累加和:',s)
while…else…结构:
while 表达式:
语句块1
else:
语句块2
这里同for…else…结构是一样的,只有当循环结构正常结束时,即中间没有遇到任何break的情况,才会执行else语句。
# 1-100之间的累加和
s=0 # 存储累加和
i=1 # (1)初始化变量
while i<=100: # (2)条件判断
s+=i # (3)语句块
# (4)改变变量
i+=1 #相当于i=i+1
else:
print('1-100之间的累加和:',s)
# 在这个循环中没有遇到中断情况,循环正常结束,因此会执行else
使用while循环模拟登录
用无限while循环模拟用户登录。
用户登录共有3次机会,3次均输入错误则禁止输入
i=0 #(1)初始化变量
while i<3: #(2)条件判断
# (3)语句块
user=input('请输入用户名:')
psw=input('请输入密码:')
if user=='lxl' and psw=='123456':
print('登录成功')
i=6 #(4)改变变量
else:
if i<2:
print('用户名或密码错误,您还有',2-i,'次机会')
i+=1 #(4)改变变量
if i==3: #当用户名或密码输入3次不正确的时候,while循环执行结束了,i的最大值为3
print('对不起,3次均输入错误')
嵌套循环
在嵌套循环中通常用于输出一些图形,例如长方形、三角形、菱形。
输出长方形
# 3行4列长方形。外层循环执行3次,内层循环执行4次
for i in range(1,4): #外层循环行
for j in range(1,5): #内层循环列
print('*',end='')
print() #空的print语句,作用是换行
输出三角形
# 直角三角形
for i in range(1,6): #5行
# *的个数与行相同,第一行 --> range(1,2),第二行 --> range(1,3)
for j in range(1,i+1):
print('*',end='')
print() #空的print语句,作用是换行
# 倒直角三角形
for i in range(1,6): # i 表示行号,第i行
# 第一行 --> range(1,6),第二行 --> range(1,5)
for j in range(1,7-i):
print('*',end='')
print() #空的print语句,作用是换行
# 等腰三角形
'''
&&&&*
&&&***
&&*****
&*******
*********
只需将打印出来的&换成空格即可
'''
for i in range(1,6): # i 表示行号,第i行
# 第一行 --> range(1,5),第二行 --> range(1,4)
for j in range(1,6-i):
print(' ',end='')
# 第一行 --> range(1,2),第二行 --> range(1,4),第三行 --> range(1,6)
for j in range(1,2*i):
print('*',end='')
print() #空的print语句,作用是换行
输出菱形
# 菱形
'''
&&&&*
&&&***
&&*****
&*******
*********
&*******
&&*****
&&&***
&&&&*
只需将打印出来的&换成空格即可.
可以发现菱形实际上是两个等腰三角形,且菱形是奇数行,因为菱形中间最长。
所以需要先判断一下菱形的行数,奇数行执行,偶数行不执行
'''
row=eval(input('请输入菱形的行数:'))
while row%2==0:
row=eval(input('菱形的行数不能为偶数,请重新输入菱形的行数:'))
#菱形的上半部分
top_row=(row+1)//2
for i in range(1,top_row+1): # i 表示行号,第i行
# 第一行 --> range(1,5),第二行 --> range(1,4)
for j in range(1,top_row+1-i):
print(' ',end='')
# 第一行 --> range(1,2),第二行 --> range(1,4),第三行 --> range(1,6)
for j in range(1,2*i):
print('*',end='')
print() #空的print语句,作用是换行
#菱形的下半部分
bottom_row=row//2
for i in range(1,bottom_row+1):
for j in range(1,i+1):
print(' ',end='')
for j in range(1,2*bottom_row-2*i+2):
print('*',end='')
print()
# 空心菱形
'''
&&&&*
&&&* *
&&* *
&* *
* *
&* *
&&* *
&&&* *
&&&&*
只需将打印出来的&换成空格即可.
空心菱形在菱形的基础上只需让第一个和最后一个打印*即可,所以加一个判断语句即可
'''
row=eval(input('请输入菱形的行数:'))
while row%2==0:
row=eval(input('菱形的行数不能为偶数,请重新输入菱形的行数:'))
#菱形的上半部分
top_row=(row+1)//2
for i in range(1,top_row+1): # i 表示行号,第i行
# 第一行 --> range(1,5),第二行 --> range(1,4)
for j in range(1,top_row+1-i):
print(' ',end='')
# 第一行 --> range(1,2),第二行 --> range(1,4),第三行 --> range(1,6)
for j in range(1,2*i):
if j==1 or j==2*i-1:
print('*',end='')
else:
print(' ',end='')
print() #空的print语句,作用是换行
#菱形的下半部分
bottom_row=row//2
for i in range(1,bottom_row+1):
for j in range(1,i+1):
print(' ',end='')
for j in range(1,2*bottom_row-2*i+2):
if j==1 or j==2*bottom_row-2*i+2-1:
print('*',end='')
else:
print(' ',end='')
print()
break
关于break有一个易错点见本章习题处。
程序跳转语句break用于跳出循环结构,通常与if一起搭配使用。
语法结构:
while表达式1:
执行代码
if 表达式2:
break
s=0 #存储累加和
i=1
while i<=10:
s+=i
if s>20:
print('累加和大于20的当前数是:',i)
break
i+=1
下面再来看学了break后,前面登录的例子如何改进:
#用户登录。有3次机会
i=0
while i<3:
user_name=input('请输入用户名:')
pwd=input('请输入密码:')
if user_name=='lxl' and pwd=='123456':
print('登录成功')
break
else:
if i<2:
print('用户名或密码错误,您还有',2-i,'次机会')
i+=1
else: #while...else...结构,当循环正常结束时执行else;若执行了break,则不会执行else
print('3次均输入错误,请明天重试')
语法结构:
for 循环遍历 in 遍历对象:
执行代码
if 表达式:
break
for i in 'hello':
if i=='e':
break
print(i)
for i in range(3): #当range()只有一个参数时,表示循环次数,i默认从0开始
user_name=input('请输入用户名:')
pwd=input('请输入密码:')
if user_name=='lxl' and pwd=='123456':
print