第四章 Python程序的流程控制

时间:2024-04-09 22:28:26

第四章 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