Python学习第五课-条件控制语句
一、条件判断语句
顺序结构
选择结构
Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。
Python 编程中 if 语句用于控制程序的执行,基本形式为:
if 判断条件:
执行语句……
else:
执行语句……
#@author:mianhua
#@Time:2021/4/20
#@File:条件判断语句.py
#@Describition:
# a =int(input('请输入123中的一个数:'))
# if a == 1:
# print(123)
# if a == 2:
# print(345)
# if a == 3:
# print("adc")
#语法: if语句在执行时,会先对条件表达式进行求值判断,
#如果为True,则执行if后的语句
#如果为False,则不执行
num =30
if num>20 and num < 40:
print("num比20大,比40小")
二、input函数
- 该函数可以获取用户的输入
2.1 特性
- 1、input 需要从键盘输入内容,否则程序将被阻塞
- 2、input 输入内容都是字符串类型
2.2 代码练习
#@author:mianhua
#@Time:2021/4/20
#@File:input语句.py
#@Describition:
a = input()
print(type(a))
print(a)
a = int(a)#将整数字符串转化为整数 int() float() list() str()
#a = eval(a)
if a==1:
print(123)
#特性
#1、input 需要从键盘输入内容,否则程序将被阻塞
#2、input 输入内容都是字符串类型
1
<class ‘str’>
1
123
三、if-else语句
if 语句的判断条件可以用>(大于)、<(小于)、==(等于)、>=(大于等于)、<=(小于等于)来表示其关系。
当判断条件为多个值时,可以使用以下形式:
3.1语法:
if 判断条件:
执行语句……
else:
执行语句……
3.2 执行流程
- 先对if后的表达式进行求值判断
- True执行if后的代码块
- False执行else后的代码块
3.3 代码练习
#@author:mianhua
#@Time:2021/4/20
#@File:if-slse语句.py
#@Describition:
a =int(input('请输入123中的一个数:'))
if a == 1:
print(123)
else:#其余所有的情况
print(345)
# elif a ==2:
# print(456)
# elif a == 3:
# print(789)
四、if-elif-else语句
4.1 语法
if 条件表达式:
代码块
elif :
代码块
elif:
代码块
else :
代码块
4.2 执行流程
- if-elif-else语句在执行时,会⾃上向下依次对条件表达式进⾏求值判断
- 如果表达式的结果为True,则执行当前代码块,然后语句结束
- 如果表达式的结果为False,则继续向下判断,直到找到True为止
- 如果所有的表达式都是False,则执行else后的代码块
4.3 代码练习
#@author:mianhua
#@Time:2021/4/20
#@File:if-elif-else语句.py
#@Describition:
value = int(input('请输入你的工资:'))
if value >= 30000:
print('有钱任性')
elif value >= 20000:
print('有钱真好')
elif value >= 10000:
print('哥也月薪上万了')
elif value >= 5000:
print('工资还说得过去')
elif value>= 2000:
print('能养活自己了')
else:
print('吃土开心')
五、while语句
循环语句是可以重复执行指定代码块的语句,循环语句分为while循环和for循环
while 循环语句
while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:
while 判断条件(condition):
执行语句(statements)……
执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。
else:
执行语句(statements)……
当判断条件假 false 时,循环结束。
执行流程图如下:
while 循环三大要素
- 1、要设定一个初始值
- 2、对初始值进行约束判断
- 3、对初始值进行修改
#@author:mianhua
#@Time:2021/4/20
#@File:while循环.py
#@Describition:
# while True:#XXX条件允许的时候执行
# print(1111)
#
#
# print(1111)
# print(1111)
# print(1111)
# print(1111)
# print(1111)
#while 循环三大要素
#1、要设定一个初始值
#2、对初始值进行约束判断
#3、对初始值进行修改
i=0
while i <5:#XXX条件允许的时候执行
print(1111)
i=i+1
#求100以内所有偶数之和
i = 0
result = 0
while i < 100:
i += 1
if i % 2 == 0:
result += i
print('结果为:',result)
'''
结果为: 2550
'''
i = 0
result = 0
while i < 100:
i += 2
result += i
print('结果为:',result)
'''
结果为: 2550
'''
六、循环嵌套
推导过程
i=0
while i<5: #行数
print(i)
i+=1
‘’‘
0
1
2
3
4
...
将数字转化为*
i=0
while i<5: #行,循环执行五次,形成五行
print('*****')
i+=1
'''
*****
*****
*****
*****
*****
'''
使用循环嵌套
i=0
j=0
while i<5: #行,循环执行五次,形成五行
while j<5:
print('*')
j+=1
i+=1
'''
*
*
*
*
*
'''
更新print()方法 添加end=()参数
i=0
j=0
while i<5: #行,循环执行五次,形成五行
while j<5:
print('*',end="")
j+=1
i+=1
‘’‘
*****
’‘’
效果是打印了一行,打印print(j)
i=0
j=0
while i<5: #行,循环执行五次,形成五行
while j<5:
print('*',end="")
j+=1
print(j)
i+=1
'''
*****5
5
5
5
5
...
根据打印结果发现,下列函数执行一遍以后,j=5,内部的循环体执行条件不满足,不再执行了
while j<5:
print('*',end="")
j+=1
所以更新j = 0到循环体内部,每次‘行’循环都重置j为0
i=0
while i<5: #行,循环执行五次,形成五行
j = 0
while j<5:
print('*',end="")
j+=1
#print(j)
i+=1
'''
*************************
'''
发现,结果都显示在同一行了,更新print()函数
i=0
while i<5: #行,循环执行五次,形成五行
j = 0
while j<5:
print('*',end="")
j+=1
print()
i+=1
'''
*****
*****
*****
*****
*****
'''
得到五行五列的现实结果
分析实现效果
'''
* #i=0 j=1 j
** #i=1 j=2
*** #i=2 j=3
**** #i=3 j=4
***** #i=4 j=5 总结规律:每行都是j需要执行局i+1次
'''
i=0
while i<5: #行,循环执行五次,形成五行
j = 0
while j<i+1:
print('*',end="")
j+=1
print()
i+=1
'''
*
**
***
****
*****
'''
等到满意结果
''' 分析想要等到的结果
***** i=0 j=5
**** i=1 j=4
*** i=2 j=3
** i=3 j=2
* i=4 j=1 总结规律:i+j=5 ,j=5-1
'''
i=0
while i<5: #行,循环执行五次,形成五行
j = 0
while j<5-i:
print('*',end="")
j+=1
print()
i+=1
'''
*****
****
***
**
*
'''
得到想要的结果
'''
九九乘法表 九行九列,外形和正三角形打印形似
'''
#新引入基本模型,然后更新数字为9,打印内容更新为乘法表
i=0
while i<9: #行,循环执行五次,形成五行
j = 0
while j<i+1:
print('{}*{}={}'.format(i,j,i*j),end="")
j+=1
print()
i+=1
'''
0*0=0
1*0=01*1=1
2*0=02*1=22*2=4
3*0=03*1=33*2=63*3=9
4*0=04*1=44*2=84*3=124*4=16
5*0=05*1=55*2=105*3=155*4=205*5=25
6*0=06*1=66*2=126*3=186*4=246*5=306*6=36
7*0=07*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*0=08*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
'''
#发现执行从零开始了,取值是0-8,更新i和j的取值范围
i=1
while i<10: #行,循环执行五次,形成五行
j = 1
while j<i+1:
print('{}*{}={}'.format(i,j,i*j),end="")
j+=1
print()
i+=1
'''
1*1=1
2*1=22*2=4
3*1=33*2=63*3=9
4*1=44*2=84*3=124*4=16
5*1=55*2=105*3=155*4=205*5=25
6*1=66*2=126*3=186*4=246*5=306*6=36
7*1=77*2=147*3=217*4=287*5=357*6=427*7=49
8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=64
9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81
'''
#两个问题,1是 跟预期的数字位置颠倒,其次是中间没有隔开,继续更新程序,更换format()中i和j的位置,其次print()中,更改end=“\t"
i=1
while i<10: #行,循环执行五次,形成五行
j = 1
while j<i+1:
print('{}*{}={}'.format(j,i,i*j),end="\t")
j+=1
print()
i+=1
'''
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
'''
#其实仔细观察可以得出,九九乘法表中第一个乘数是列值,第二个乘数是行值,之前等说印度小学生学的乘法表是到11的,那么我们可以实现一下
i=1
while i<12: #行,循环执行五次,形成五行
j = 1
while j<i+1:
print('{}*{}={}'.format(j,i,i*j),end="\t")
j+=1
print()
i+=1
'''
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
1*10=10 2*10=20 3*10=30 4*10=40 5*10=50 6*10=60 7*10=70 8*10=80 9*10=90 10*10=100
1*11=11 2*11=22 3*11=33 4*11=44 5*11=55 6*11=66 7*11=77 8*11=88 9*11=99 10*11=110 11*11=121
'''
七、continue和break
- break可以用来立即退出循环语句,包括else语句
- continue用来跳过当次循环
i=0
while i<5: #行数
i+=1
if i==2:
break
#continue
print(i)
else:#while循环的后继语句,会在循环结束后继续执行
print('正常执行完毕')
'''
1
'''
i=0
while i<5: #行数
i+=1
if i==2:
#break
continue
print(i)
else:#while循环的后继语句,会在循环结束后继续执行
print('正常执行完毕')
'''
1
3
4
5
正常执行完毕
'''
八、作业
8.1 取1000以内所有水仙花数
- 水仙花数(Narcissistic number)也被称为超完全数字不变数(pluperfect digital invariant, PPDI)、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数(Armstrong number),水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153
- 设计思路:遍历100-999之前所有数值,对该数值取各位,十位,百位的值,如果
各位,十位,百位的三次幂之和等于这个值,则显示该值
#方法一:数学计算法获取个十百位数
i = 100
while i < 1000:
b = (i // 100)
s = ((i - b * 100) // 10)
g = (i - 100 * b - 10 * s)
if i == b ** 3 + s ** 3 + g ** 3:
print(i)
i += 1
#结果如下
'''
153
370
371
407
'''
#方法二:字符串切片法获取个十百位数
i=100
while i<1000:
a = str(i) #将数字转化为字符串
b = int(a[0]) #百位
s = int(a[1]) #十位
g = int(a[2]) #个位
if i == b** 3 + s** 3 + g** 3:
print(i)
i+=1
#结果如下
'''
153
370
371
407
'''
#更新下显示效果,增加总数统计一个当前是第几个数
i = 100
num = 0
while i < 1000:
b = (i // 100)
s = ((i - b * 100) // 10)
g = (i - 100 * b - 10 * s)
if i == b ** 3 + s ** 3 + g ** 3:
print('第{}个水仙花数是:{}'.format(num + 1, i))
num += 1
i += 1
print(f"10000以内的水仙花有{num}个。")
'''
第1个水仙花数是:153
第2个水仙花数是:370
第3个水仙花数是:371
第4个水仙花数是:407
10000以内的水仙花有4个。
'''
8.2 判断用户输入是否为质数
# 用户输入数字
num = int(input("请输入一个数字: "))
# 质数大于 1
if num > 1:
# 查看因子
for i in range(2, num):
if (num % i) == 0:
print(num, "不是质数")
print(i, "乘于", num // i, "是", num)
break
else:
print(num, "是质数")
'''
请输入一个数字: 4
4 不是质数
2 乘于 2 是 4
'''
# 升级:1、规范化输入内容必须为整数,2,增加了对与1和0的判断
num = input("请输入一个数字: ")
if num.isdigit() ==True: #判断输入内容是否所有都为整形数字
num=int(num)
if num > 1:
# 查看因子
for i in range(2, num):
if (num % i) == 0:
print(num, "不是质数")
print(i, "乘于", num // i, "是", num)
break
else:
print(num, "是质数")
else:
print(num, "不是质数,质数是指在大于1的自然数")
else:
print("输入内容非法,请重新输入!")
# 再次升级:增加对2的判断
num = input("请输入一个数字: ")
if num.isdigit(): #判断输入内容是否所有都为整形数字
num=int(num)
if num > 1:
# 查看因子
for i in range(2, num):
if (num % i) == 0:
print(num, "不是质数")
print(i, "乘于", num // i, "是", num)
break
else:
print(num, "是质数")
if num==2:#增加对2的判断
print(num, "是质数")
else: #增加了对于1和0的判断
print(num, "不是质数,质数是指在大于1的自然数")
else:
print("输入内容非法,请重新输入!")
#再再再升级,1、更新算法,增加对大数判断的兼容性,2、增加while循环,方便程序测试
while True:
num = input("请输入一个数字: ")
if num.isdigit(): #判断输入内容是否所有都为整形数字
num=int(num)
i = 2
while i < num:
s = num % i
if s == 0:
print("{}不是质数,{}能被{}整除".format(num,num, i))
break
else:
i += 1
if num == i :
print("{}是质数".format(num))
elif num<=1: #增加了对于1和0的判断
print(num, "不是质数,质数是指在大于1的自然数")
else:
print("输入内容非法,请重新输入!")
#修复厨师算法Bug
while True:
num = input("请输入一个数字: ")
if num.isdigit(): #判断输入内容是否所有都为整形数字
num=int(num)
if num <= 1: # 增加了对于1和0的判断
print(num, "不是质数,质数是指在大于1的自然数")
elif num ==2 or num ==3:
print(num, "是质数")
elif num>2:
for i in range(2, num):
if (num % i) == 0:
print(num, "不是质数")
print(i, "乘于", num // i, "是", num)
break
elif num == i+1:
print(num, "是质数")
else:
i += 1
else:
print(num, "是质数")
else:
print("输入内容非法,请重新输入!")
8.3 猜拳游戏:
- 出拳阶段:玩家输入,电脑随机
- 判断阶段:玩家胜,电脑胜,平局
设计思路:结果分类一共是三类,玩家获胜,电脑获胜和平局,首先平局比较好判断,直接a,b两个值相等就可以了,可以作为一个分支,其次是玩家获:首先设计时,可以发现,0:剪刀,1:石头,2:布,的分布刚好是后面的值大于前面的值,这里里面有2个特殊情况,1是a是2:布,b是0:剪刀,虽然2>0,但电脑获胜,所以这种情况,单独设计一个分支,2,是 a是0:剪刀,b是2:布,虽然a<b,但玩家获胜,可以和a>b合并,作为一个分支,剩下的情况就是电脑获胜了,单独一个else。
#@author:mianhua
#@Time:2021/4/21
#@File:猜拳游戏思想.py
#@Describition:1、猜拳游戏:出拳玩家:手动输入电脑:随机输入 2、判断输赢: 玩家获胜电脑获胜平局
import random
a = eval(input('猜拳游戏,0:剪刀,1:石头,2:布,请输入:'))
b = random.randint(0,2)
print('电脑选择:',b)
if a ==2 and b ==0:
print('电脑获胜')
elif a == b:
print('此局平局')
elif a>b or (a==0 and b==2):
print('玩家获胜')
else:
print('电脑获胜')
升级
#@author:mianhua
#@Time:2021/4/21
#@File:作业-猜拳游戏.py
#@Describition:1、猜拳游戏:出拳玩家:手动输入电脑:随机输入 2、判断输赢: 玩家获胜电脑获胜平局 3、加入while循环,执行10次 4、统计胜负情况
import random
num = 0
win = 0
lose = 0
blan = 0
def gambling():
global win, lose, blan
print('-----------------------------')
a = eval(input('请输入:'))
b = random.randint(0,2)
if a ==0 and b ==0:
#print(a, b)
print('玩家:石头\n电脑:石头\n此局平局')
blan+=1
elif a==0 and b==1:
#print(a, b)
print('玩家:石头\n电脑:布\n电脑获胜')
lose+=1
elif a==0 and b==2:
#print(a, b)
print('玩家:石头\n电脑:剪刀\n玩家获胜')
win+=1
elif a==1 and b==1:
#print(a, b)
print('玩家:布\n电脑:布\n此局平局')
blan+=1
elif a==1 and b==0:
#print(a, b)
print('玩家:布\n电脑:石头\n玩家获胜')
win+=1
elif a==1 and b==2:
#print(a, b)
print('玩家:布\n电脑:剪刀\n电脑获胜')
lose+=1
elif a==2 and b==2:
#print(a, b)
print('玩家:剪刀\n电脑:剪刀\n此局平局')
blan+=1
elif a==2 and b==1:
#print(a, b)
print('玩家:剪刀\n电脑:布\n玩家获胜')
win+=1
elif a==2 and b==0:
#print(a, b)
print('玩家:剪刀\n电脑:石头\n电脑获胜')
lose+=1
else:
#print(a, b)
print('请重新输入')
while num<10:
print('猜拳游戏第{}/10局,0:石头,1:布,2:剪刀'.format(num+1))
gambling()
print('---------------------')
num+=1
print('玩家一共,胜{}局,负{}局,平{}局'.format(win,lose,blan))
猜拳游戏第1/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:布
此局平局
猜拳游戏第2/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:剪刀
电脑获胜
猜拳游戏第3/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:石头
玩家获胜
猜拳游戏第4/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:石头
玩家获胜
猜拳游戏第5/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:石头
玩家获胜
猜拳游戏第6/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:布
此局平局
猜拳游戏第7/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:石头
玩家获胜
猜拳游戏第8/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:布
此局平局
猜拳游戏第9/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:剪刀
电脑获胜
猜拳游戏第10/10局,0:石头,1:布,2:剪刀
请输入:1
玩家:布
电脑:剪刀
电脑获胜
玩家一共,胜4局,负3局,平3局