第四章 Python程序的流程控制

第四章 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('登录成功')
        break
    else:
        if i<2:
            print('用户名或密码错误,您还有',2-i,'次机会')
    i+=1
else: #for...else...结构,当循环正常结束时执行else;若执行了break,则不会执行else
    print('3次均输入错误,请明天重试')

continue

continue的作用是用于跳过本次循环的后续代码,而继续执行下一次循环操作,continue在循环中通常也是与if一起搭配使用。

语法结构:

while表达式1:
  执行代码
  if 表达式2:
    continue

在这里插入图片描述

s=0
i=1
while i<=100:
    if i%2 == 1: #奇数
        i+=1 #(3)改变变量
        continue #不再执行后面的代码了
    # 累加求和的代码
    s+=i
    i+=1 #(3)改变变量
print('1-100之间偶数的累加和为:',s)

 
语法结构:

for 循环遍历 in 遍历对象:
  执行代码
  if 表达式:
    continue

在这里插入图片描述

s=0
for i in range(1,101):
    if i%2==0:
        continue
    s+=i
print('1-100之间偶数的累加和为:',s)

空语句pass

pass是Python中的保留字,在语法结构中只起到占位符作用,使语法结构完整,不报错。一般可用在if、for、while、函数的定义、类的定义中。

if True:
    pass

'''
以下这个是死循环
while True:
    pass
'''

for i in range(10):
    pass

章节习题

在这里插入图片描述

for i in 'python':
    for j in range(2):
        print(i,end='')
        if i=='h':
            break

易错:注意这里break只会跳出内层循环

 
题目:模拟10086查询功能。
需求:输入1,显示当前余额;输入2,显示当前的剩余流量,单位为G;输入3,显示当前的剩余通话,单位为分钟;输入0,退出自助查询系统。

# 模拟10086查询功能
answer='y' #(1)初始化变量
while answer=='y': #(2)判断条件
    print('-----模拟10086查询功能-----')
    print('1.查询余额')
    print('2.查询当前剩余流量')
    print('3.查询当前剩余通话时长')
    print('0.退出系统')
    choice=input('请输入您要查询的内容:')
    if choice=='1':
        print('您当余额为100元')
    elif choice=='2':
        print('您当前剩余流量100G')
    elif choice=='3':
        print('您当前剩余通话时长')
    elif choice=='0':
        print('退出系统,欢迎下次使用')
        break
    else:
        print('输入有误,请重新输入')
    answer=input('还继续操作吗? y/n') #(4)改变变量
else: #while...else...结构
    print('退出系统,欢迎下次使用')

 
题目:使用嵌套循环输出九九乘法表。
需求:使用嵌套循环输出九九乘法表,内层循环与外层循环的关系,输出的数据的个数与行数相同,即第一行输出一个,1*1=1,第二行输出两个1*2=2 2*2=4 以此类推。

# 输出九九乘法表。分析:九九乘法表从形状上来看就是打印直角三角形
for i in range(1,10):
    for j in range(1,i+1):
        print(str(j)+'*'+str(i)+'='+str(i*j),end='\t')
    print()

在这里插入图片描述
 
 
题目:猜数游戏。
需求:随机生成一个1~100之间的整数,然后用户循环猜这个数,对于用户的输入,可提示“大了”,“小了”,直到猜准确为止,输出用户的猜测次数。
产生随机数的代码如下:

import random
rand=random.randint(1,100) #产生1-100之间的随机数,包含1和100

详细的random模块方法见:菜鸟教程

实现代码:

#猜数游戏
import random
rand=random.randint(1,100) #产生1-100之间的随机数,包含1和100
count=1 #记录猜数的次数
while count<=10:
    number=eval(input('在我心中有个数:1-100之间,请你猜一猜'))
    if number==rand:
        print('猜对了!')
        break
    elif number<rand:
        print('小了')
    else:
        print('大了')
    count+=1 #每猜一次count次数要加1
#判断次数
if count<=3:
    print('真聪明,一共猜了',count,'次')
elif count<=6:
    print('还可以,一共猜了',count,'次')
else:
    print('猜的次数有点多啊,一共猜了',count,'次')

相关推荐

  1. Python tutorial 2.7.13(深入 Python 流程控制

    2024-04-09 22:38:02       15 阅读
  2. python程序流程控制

    2024-04-09 22:38:02       34 阅读
  3. 4周 Python程序流程控制刷题

    2024-04-09 22:38:02       19 阅读
  4. Python学习笔记(流程控制方法

    2024-04-09 22:38:02       31 阅读
  5. _Docker资源控制

    2024-04-09 22:38:02       8 阅读
  6. 4周 Python程序流程控制刷题(循环结构)

    2024-04-09 22:38:02       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 22:38:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 22:38:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 22:38:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 22:38:02       18 阅读

热门阅读

  1. Linux C++ 022-函数模板

    2024-04-09 22:38:02       10 阅读
  2. python把视频按帧转化为图片并保存

    2024-04-09 22:38:02       15 阅读
  3. Linux下I2C驱动框架:I2C 设备驱动

    2024-04-09 22:38:02       17 阅读
  4. 【Linux篇】makefile一次形成两个可执行

    2024-04-09 22:38:02       17 阅读
  5. Kubernetes统一管理vGPU:原理、实现与挑战

    2024-04-09 22:38:02       18 阅读
  6. 大模型从入门到应用——OpenAI基础调用

    2024-04-09 22:38:02       15 阅读
  7. 程序员如何搞副业?

    2024-04-09 22:38:02       17 阅读
  8. Go语言支持重载吗?如何实现重写?

    2024-04-09 22:38:02       15 阅读
  9. @Transactional 详解

    2024-04-09 22:38:02       11 阅读
  10. 雷军给年轻人的五点建议

    2024-04-09 22:38:02       10 阅读
  11. playwright入门-相遇(基础篇)

    2024-04-09 22:38:02       13 阅读