python知识点day05

第五章 程序流程结构

5.1 算法

算法就是解决问题的步骤。
算法不唯一,但是有优劣。评价维度:时间复杂度,空间复杂度。
表示算法的方式有很多,最主要的一种就是流程图。
符号:圆角矩形 —程序的开始/结束
平行四边形–输入或输出
直角矩形–处理步骤(运算,赋值)
菱形—判断(布尔表达式)
流程线
计算机专家发现,不管多么简单或多么复杂的算法都可以由顺序结构,选择结构,循环结构组合而成。

5.1 顺序结构

从左往右,从上往下依次执行
写出来的代码都会执行

5.2 选择结构 /条件结构

场景:需要做出选择/做出判断,才知道如何执行
1、单分支结构
语法:

if 条件:
代码块

1)条件:结果只要是布尔值就行,所以也叫布尔表达式。可以是变量,关系表达式,逻辑表达式bool(变量)–0,0.0,空字符串、空字典,空集合,空列表等返回false,其它都返回true
2)代码块:可以是赋值,运算,流程结构等
3)python靠缩进表达代码的层次关系,缩进一般使用tab键
执行顺序: 先判断条件,如果条件为true,则执行代码块。否则不执行代码块
案例:

aply = input("笔试通过了吗?")
if aply == 'y':
print('明天参加面试')
# 输入三个数,求最大值
# a b c
# max=a
a = int(input('请输入一个数:'))
b = int(input('请输入一个数:'))
c = int(input('请输入一个数:'))
max = a
if max<b:
max=b
if max<c:
max=c
print('最大值是',max)

2、双分支结构
语法:

if 条件:
代码块1
else:
代码块2

执行顺序:先判断条件,条件为true,则执行代码块1,否则执行代码块2
案例:

# 模拟以下QQ登录
# 正确的账号:QQ :123456 密码:123
account = input("请输入QQ号:")
pwd = input('请输入密码:')
if account == '123456' and pwd == '123':
print('登录成功')
else:
print('账号密码不匹配')

简化写法:条件表达式

表达式1 if 条件 else 表达式2

执行顺序:条件为true,表达式的结果就是表达式1,否则整个表达式的结果就是表达式2

# 输入一个数,判断奇偶性
num = int(input('请输入一个整数'))
s = '奇数' if num%2==1 else '偶数'
print(s)
print('奇数' if num%2==1 else '偶数')

3、多分支结构
3.1 多重if结构
语法:

if 条件1:
代码块1
elif 条件2:
代码块2
elif 条件3:
代码块3
else:
代码块4

执行顺序:先判断条件1,如果条件1为true,则执行代码块1否则判断条件2,如果条件2为true,则执行代码块2否则判断条件3,如果条件3为true,则执行代码块3
场景:一个维度连续区间的多路分支

# 给成绩评级 60以下差,60-80中 80-90良,90以上优
# 一个维度(成绩),连续区间
score = int(input('请输入成绩'))
if 0<score < 60: # 0-60
print('差')
elif score<=80: #60-80
print('中')
elif score<=90: #80-90
print('良')
else:
print('优')
# 或者
if 100>=score > 90:
print('优')
elif score>=80:
print('良')
elif score>=60:
print('中')
else:
print('差')

注:python中关系表达式允许连写0<score < 60

3.2 嵌套if结构
语法:
if 条件1: if 条件2: 代码块1 else: 代码块3 else: 代码块2
执行顺序:
场景:多个维度的多路分支
案例:

# 超市活动 如果不是会员,消费满100打9折;如果是会员,消费满200打7折,不满200打8折。
# 根据会员及消费金额输出应付金额
# pass 什么都不做,只是一个占位符,代替需要写的语句
# 进行代码建构的时候,还不想写代码,可以使用pass先代替
isVip = input('是否是会员?')
sumMoney = int(input('请输入消费金额:'))
discount=1
if isVip=='y':
if sumMoney>=200:
discount=0.7
else:
discount=0.8
else:
#不是会员
if sumMoney>=100:
discount=0.9
print(f'应该支付{sumMoney*discount}')

3.3 switch在python没有

5.3 循环结构

场景:有重复做的事情(可以是一样的事情,也可以是有规律的事情)
循环的特点:
循环操作:重复在做的事情
循环条件:循环继续的条件,循环结束的条件
如果循环永不结束,就叫死循环。初学程序的时候,要避免死循环。
编码时,循环条件会借助循环变量来表达。
如,计数器count=0(循环变量的初始化) count+=1(循环变量的更新) count<=10(循环条
件)
5.3.1 while循环
语法:

循环变量的初始化
while 循环条件:
循环操作
循环变量的更新
``
`特点:先判断,再执行
如果循环条件一开始就不成立,循环操作可能一次都不执行
 适合循环次数不固定的情况
案例

```python
# 输出10个*
# 循环操作:输出1个*
# 循环条件:count=1 count<=10
count = 11
while count<=10:
print('*')
count+=1
# 输出1-100之间的整数
# 循环操作:输出一个数 print(i)
# 循环条件:i=[1,100]
i = 1
while i<=100:
print(i)
i+=1
# 输出1-100之间的偶数
# 输出100-1之间整数
# 求和1-100
# 循环操作:1+2 +3 +4 +。。。+100 ---> sum+=num --累加求和
# 循环变量 num=[1,100] sum=0 就是存储每一次计算的和
print('--------------')
num = 1
sum = 0
while num<=100:
sum+=num
num+=1
print(f'1-100之间的整数和为{sum}')
# 求1-100之间的奇数和
# 扩展计算: 1-2+3-4+5-6...-100
# 求1*2*3*4*5*6---累乘求积
print('-----------')
num = 1
sum = 0
while num<=100:
if num%2==0:
sum-=num
else:
sum+=num
num+=1
print(f'1-2+3-4+5-6...-100和为{sum}')
# 计数器
# 输入5个学生的成绩,统计80分以上的比例
# count 存储80分以上的成绩数
print('------------')
i = 1
count = 0
while i<=5:
score = int(input(f'请输入第{i}个学生的成绩:'))
if score>=80:
count+=1
i+=1
print(f'80以上的学生有{count}个,占比{count/5*100}%')

while适合循环次数不固定的情况

'''
*****欢迎拨打中国移动服务热线******
1、电话业务
2、宽带业务
3、人工服务
********************************
请选择:2
宽带业务
请问还有其它需要吗?(y是,n否)
'''
choice = 'y'
while choice=='y':
print('*****欢迎拨打中国移动服务热线******')
print(' 1、电话业务')
print(' 2、宽带业务')
print(' 3、人工服务')
print('********************************')
num = int(input('请选择:'))
if num==1:
print('电话业务')
elif num==2:
print('宽带业务')
else:
print('人工服')
print()
choice=input('请问还有其它需要吗?(y是,n否)')
print('谢谢,再见')

5.3.2 for in循环
语法

for 变量名 in 可迭代对象:
循环操作

特点:循环次数固定,优先for;常用来遍历容器对象
可迭代对象:字符串、range对象
range()函数 可以生成整数序列
range(stop) 生成[0,stop)之间的整数序列,步长是1
range()函数只存储这start,stop,step个变量,节省内存

# 生成[0,10)之间的整数
r = range(10)
print(list(r))
# range(start,stop)---[start,stop) 步长为1
r2 = range(1,10)
print(list(r2))
# range(start,stop,step) ---[start,stop) 步长为step
r3 = range(1,10,2)
print(list(r3))
#
for i in range(1,11):
print(i)
# 猜数字 num 结果是对了,大了,小了
print('--------------')
num = 35
for _ in range(1,4):
n = int(input('请猜:'))
if n==num:
print('猜对了')
#退出for,结束
break
elif n>num:
print('猜大了')
else:
print('猜小了')
# 输入5个学生的年龄,求平均值
# 求两个值的最大公约数

5.3.3 循环中的break、continue、else
break:中断指令,也使用在循环中,结束当前所在层的循环

#break:中断指令,当前所在层的循环
#跑10圈 7圈跑不动了,要求退出--break
for i in range(1,11):# [1,2,3,4,5,6,7,8,9,10]
if i==7:
print(f'跑到第{i}圈,实在跑不动了,要求退出')
break
print(f'跑了{i}圈')
#也可以使用在while中
i= 1
while i<=10:
if i==7:
print(f'跑到第{i}圈,实在跑不动了,要求退出')
break
print(f'跑了{i}圈')
i+=1
#练习:QQ登录(2890993,8888) ,有3次机会,如果某一次登录成功了,可以直接退出

continue:中断指令,也使用在循环中,结束本轮循环

#continue 结束本轮循环,之后的代码不再执行,继续下一轮的循环
#跑10圈 7圈跑不动了,休息一圈,下一圈跟着跑---continue
for i in range(1,11):
if i==7:
print('实在跑不动了,下一圈再跟着跑')
continue
print(f'跑了{i}圈')
# 统计5个学生成绩80分以上的人数
count=0
for i in range(1,6):
score = int(input(f'请输入第{i}个学生成绩:'))
# if score>=80:
# count+=1
if score<80:
continue
count+=1
print(f'{count}个学生成绩大于80')

else:和while/for-in搭配使用,不碰到break退出时才会执行到的代码

# else 和while/for-in搭配使用,不碰到break退出时才会执行到的代码
i= 1
while i<=10:
# if i==7:
# print(f'跑到第{i}圈,实在跑不动了,要求退出')
# break
print(f'跑了{i}圈')
i+=1
else:
print('正常完成')
# 输入一个数(2-100),判断是否是质数
num = int(input('输入一个数(2-100):'))
# [2,num) 看是否有能被num整除的,如果有,则不是质数。如果一个都没有,则是质数
# for i in range(2,num):
# if num%i==0:
# print('不是质数')
# break
# else:
# print('是质数')
print('-------其它语言中借助布尔值来实现-----')
flag = True # True 是质数 False 不是质数
for i in range(2,num/2):
if num % i == 0:
flag = False
break
if flag:
print('是质数')
else:
print('不是质数')

5.3.4 双重循环:
一个循环嵌套在另一个循环中
外层循环执行一轮,内层循环执行一遍 —>双重循环要执行的次数

# 计算3个班5个学生的平均成绩
# 外层循环控制班数
# 内层循环控制一个班有多少学生
# 外层循环执行一轮,内层循环执行一遍 --->双重循环要执行的次数
j = 1
while j<=3:
print(f'第{j}个班:')
i = 1
sum = 0
while i <= 5:
score = int(input(f'请输入第{i}个学生的成绩:'))
sum += score
i += 1
avg = sum / 5
print(f'平均成绩为{avg}')
j+=1
print()
# 输出2-100之间的质数
# break、continue、else都一样

打印图形练习

'''
*****
*****
*****
'''
# 外层循环控制行数
# 内层循环控制列数
row = 7
col = 4
for j in range(1,row+1):
for i in range(1, col+1):
print('*', end='')
print()
'''
11111
22222
33333
'''
print()
row = 3
col = 5
for j in range(1,row+1):
for i in range(1, col+1):
print(j, end='')
print()
'''
123456
123456
123456
'''
'''
*
**
***
****
*****
'''
'''
分析
# 外层 i [1,5]
# 内层 j [1,i]
i j
1 [1,1]
2 [1,2]
3 [1,3]
'''
print()
for i in range(1,6):
for j in range(1,i+1):
print('*',end='')
print()
'''
*****
****
***
**
*
'''
'''
外层 i [1,5]
内层 j [1,6-i]
i j
1 [1,5]
2 [1,4]
3 [1,3]
'''
'''
外层 i [5,1]
内层 j [1,i]
i j
5 [1,5]
4 [1,4]
3 [1,3]
'''
'''
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=20
...
'''
'''
*
***
*****
*******
*********
'''
'''
外层:i [1,5]
内层:空格j [1,5-i] * k[1,2*i-1]
i j k
1 [1,4] [1,1]
2 [1,3] [1,3]
3 [1,2] [1,5]
4 [1,1] [1,7]
5 [1,0]
'''
for i in range(1,6):
for j in range(1,5-i+1):
print(' ',end='')
for k in range(1,2*i):
print('*',end='')
print()

5.3.4 循环作业讲解
1、求两个数最大公约数
参考链接:https://www.cnblogs.com/schips/p/10658253.html

# 最大公约数就是能被两个数整除的最大数
# 穷举法
m = 24
n = 36
# 1、先求两个数的最小数
min = m
if min<n:
min=n
num=1
# for i in range(1,min+1):
# if m%i==0 and n%i==0:
# num=i
for i in range(min,0,-1):
if m % i == 0 and n % i == 0:
num=i
break
print(f'最大公约数就是{num}')
#辗转相除法 求最大公约数
a = 48
b = 24
if a<b:
a,b=b,a
while True:
c=a%b
if c==0:
print(f'最大公约数是{b}')
break
else:
a=b
b=c

2、整数反转

#整数反转:如123,输出543
'''
123 ---321
123%10--- 3 =0*10+3
123//10--12
12%10 -- 2--32=3*10+2
12//10 --1
1%10 -- 1---321=32*10+1
1//10 -- 0
'''
num = 12321
temp = num
num2=0
while True:
yu=num%10
# print(yu,end='')
num2=num2*10+yu
num=num//10
if num==0:
break
print(num2)
if num2==temp:
print(f'{temp}是回文数')
else:
print(f'{temp}不是回文数')
#判断一个整数是否是回文数 121--121 12321--12321 abcba

3、1~10之间的整数相加,得到累加值大于20的当前数 1+2+3+4…加到几和超过20

sum = 0
for i in range(1,11):
sum+=i
if sum>20:
print(f'加到{i}就超过20了')
break
#5、输出10000以下的完全数。如果一个正整数等于除它本身之外其它所有除数之和,就称之为完全数。
#如6就是第一个完全数,因为6=1+2+3
for i in range(1,10000):
sum = 0
for j in range(1,i):
if i%j==0:
sum+=j
if sum==i:
print(i)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值