多分支结构和循环
1. if
if的 多分支结构 根据不同条件做不同事情,
注意:其中一个条件成立了,其他的都不会成立
语法:
if 条件语句1:
代码段1:
elif 条件语句2::
代码段2:
elif 条件语句3::
代码段3:
…
else:
代码段N
练习:根据分数对成绩进行评级
def level():
grade=int(input('输入成绩,获得评级:'))
if grade<0 or grade>100:
print('你输入的分数有误!')
elif grade>=90:
print('您的评级是A!')
elif grade>=80:
print('您的评级是B!')
elif grade>=60:
print('您的评级是C!')
else:
print('您的评级是D!')
level()
练习:进校标准(无因果关系的情况下,写多个if就好)
score=492
grade='A'
if score>500:
print('进普通班级')
if grade=='A':
print('进特长班')
练习:判断正常,偏瘦,偏重(公式有问题,怎么都是偏瘦)
def judge():
height, weight = map(float, input('请输入身高(m)和体重(kg),注意用空格隔开:').split())
result=weight / (height ** 2)
if result >= 24.9:
print('正常,完美!')
elif result >= 18.5:
print('偏瘦,加油,还有待提高!')
else:
print('偏胖,请勿熬夜和暴饮暴食!')
judge()
练习:判断一个数是否是偶数,如果是打印’偶数’否则打印’奇数’,同时判断这个数是否是4的倍数,如果是打印’4的倍数’
def judge_1():
num=int(input('请输入数字:'))
if num%2:
print('是奇数')
if num%2==0:
print('是偶数')
if num%4==0:
print('是4的倍数')
judge_1()
2. for
语法:
for 变量 in 序列:
循环体
说明:
1)for ,in -关键字:固定写法
2)变量 - 变量名
3)序列 - 容器型数据类型的数据,例如:字符串,列表,字典,元组,集合,迭代器,生成器
4)循环体 -和for保持一个缩进的一条或多条语句;循环体就是需要重复执行的代码
执行过程:
让变量去序列中取值,一个一个的取,取完为止,每取一个就执行一次循环体(系列中元素的个数决定了循环的次数)
range()的用法:
range(N) - 产生一个[0,N)的数字序列 N > 0
range(M,N) - 产生一个[M,N)的数字序列 M < N
range(M,N,step) - 产生一个[M,N)的数字序列
step为步长(每次数字增加的值) M < N
:注意步长可以为负
for x in range(10,0,-1):
print('x:',x)
练习:统计100以内,能被3整除的数的个数
count=0
for i in range(0,100,3):
count+=1
print('100以内,能被3整除的数的个数:',count)
练习:统计100以内,能被3整除且不能被5整除,的数的和
sum=0
for i in range(3,101,3):
if i%3==0 and i%5:
sum+=i
print('1~100以内,能被3整除且不能被5整除,的数的和是:',sum)
3. while
语法:
while 条件语句:
循环体
说明:
1)while - 关键字;固定写法
2)条件语句 - 任何有结果的表达式
3)循环体 - 和while 保持一个缩进的一或多条语句
循环体就是需要重复执行的代码块
执行过程,判断条件语句,为True就执行,直到执行到为False,停止循环
练习:打印1~100 用for循环更简单
i=1
while(i<=100):
print('i:',i)
i+=1
练习:输入密码
def code_judge():
code=''
while 1:
code=input('请输入密码:')
if code=='abc123':
print('密码正确!')
break
else:
print('密码错误,请重新输入!')
code_judge()
练习: 猜数字:随机产生一个数(100以内),去猜,直到猜对
from random import randint
def caiMi():
num = randint(0, 99)
while 1:
x = int(input('猜数字,请输入0~99之间的数:'))
if x == num:
print('猜对了!')
break
elif x < num:
print('猜错了,再往大猜猜!')
else:
print('猜错了,再往小猜猜!')
caiMi()
4. 重要知识点的补充
1. continue 和 break
只能在循环体里边使用
continue:结束一次循环(遇到continue,当次循环结束,进入下次循环判断)
break:结束整个循环(遇到break,整个循环直接结束)
练习:熟悉continue和break的用法
关于中断 continue , break , 和 for 或者 while 循环中 else 的使用方法
for i in range(4):
print(i,'+++++')
if i%2==0:
#continue #当前for循环后面的代码不执行,继续下一次的for循环
break #直接退出for循环代码块
print(i,'=====')
else:
print('无异常') #常用来判断程序中for 或者 while 循环是否正常执行
2.重要!!else 在for 或者while循环中的使用
python中完整的for,while循环后面都有else结构,该结构不影响原来循环的影响
循环自然死亡,结束后,else后面的代码段会执行,
循环遇到break而结束,else代码段不会执行
for 变量 in 序列:
循环体
else:
代码段
while 条件语句:
循环体
else:
代码段
练习:熟悉else的用法
for x in range(5):
print('xxx')
# break
print('hello')
else:
print('无异常')
作业:
基础题
- 根据输入的成绩的范围打印
及格
或者不及格
。
def marginal():
grade=int(input('请输入成绩(0~100):'))
if grade>=60:
print('恭喜!你合格了!!')
else:
print('没有及格,请继续努力!')
marginal()
结果如图:
- 根据输入的年纪范围打印
成年
或者未成年
,如果年龄不在正常范围内(0~150)打印这不是人!
。
#先判断是不是人
#再判断是否成年,没有就是未成年
def adult():
age=int(input('请输入年龄:'))
if age>=0 and age<=150:
if age<18:
print('未成年!')
else:
print('你好,已成年!')
else:
print('这不是人!')
adult()
结果:
- 输入两个整数a和b,若a-b的结果为奇数,则输出该结果,否则输出提示信息
a-b的结果不是奇数
。
def odd():
a,b=map(int,input('判断两个整数(a,b)的差是否为奇数(用空格隔开):').split())
if (a-b)%2: #是奇数
print(a-b)
else:
print('a-b的差不是奇数')
odd()
结果图:
- 使用for和while循环输出 0~100内所有3的倍数。
for i in range(3,100,3):
print(i)
num=3
while num<=100:
print(num)
num+=3
法二
num1=0
while 1:
if num1<=100:
print(num1)
num1+=3
else:
break
- 使用for和while循环输出100~200内个位数或者十位数能被3整除的数。
for i in range(100,200):
a=i%10 #取个位数
b=i//10%10 #取原十位数
if a%3==0 or b%3==0:
print(i)
n=100
while n<201:
c=n%10
d=n//10%10
if c%3==0 or d%3==0:
print(n)
n+=1
n1=100
while 1:
if n1%3%3==0 or (n1//10%10)%3==0:
print(n1)
n1+=1
if n1>=200:
break
进阶题
- 使用循环计算
1*2*3*4*...*10
的结果。
product=1
for i in range(1,11):
product*=i
print('乘积是:',product)
结果:
- 统计100以内个位数是2并且能够被3整除的数的个数。
count=0
for i in range(12,101):
if i%10==2 and i%3==0:
count+=1
print('count:',count)
法二(补充)
count1=0
for i in range(12,100,10):
if i%3==0:
count1+=1
print('count1:',count1)
结果:
- 输入任意一个正整数,求他是几位数?
注意: 这儿不能使用字符串,只能用循环
def how_many():
num=len(input('请输入一个整数,我来判断有几位:'))
print('这个数有',num,'位:')
how_many()
def how_many1():
num=int(input('请输入一个整数,我来判断有几位:'))
count=0
if num==0:
print('输入的数有1位')
else:
while num != 0:
count += 1
num //= 10
print('输入的数有',count,'位',sep='')
how_many1()
法二:用死循环来写更简洁
def how_many2():
num=int(input('请输入一个整数,我来判断有几位:'))
count=0
while 1:
num//=10
count+=1
if num==0:
break
print('输入的数有',count,'位',sep='')
how_many2()
结果:
- 打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是
⼀个⽔仙花数,因为1³ + 5³ + 3³
等于 153。
for i in range(100,1000):
a=i//100 #百位
b=i//10%10 #十位
c=i%10 #个位
if a**3+b**3+c**3==i:
print(i)
结果:
挑战题
- 判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)
def prime_num():
num=int(input('判断输入的数是否为质数:'))
if num==2:
print(num,'是质数!')
return
for i in range(2,num):
if num%i==0:
print(num,'不是质数!')
break
print(num,'是质数!!')
prime_num()
法二:对1进行数学优化
import math
def prime_num1(): #也可利用for-else结构(非必要)
num=int(input('判断输入的数是否为质数:'))
if num==2:
print(num,'是质数!')
return
for i in range(2,math.ceil(num**0.5)+1):
if num%i==0:
print(num,'不是质数!')
break
else:
print(num,'是质数!!')
prime_num1()
结果:
- 求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368
def fibo_n():
result=[0]
a,b=0,1
num=int(input('你想输出菲波那切数列的第n个数的值:'))
for i in range(num):
a,b=b,a+b
result.append(a) #从第二个开始添加
print('菲波那切数列的第',num,'个数的值是:',result[num-1])
# print('菲波那切数列的第n+1个数的值是:',b)
fibo_n()
法二:可以不用数组保存,直接输出
def fibo_n1():
a,b=1,1
num=int(input('你想输出菲波那切数列的第n个数的值:'))
if num>2: #num大于2,开始斐波那切数列的迭代
for i in range(num-2):
a, b = b, a + b
print('你想输出菲波那切数列的第n个数的值:',a+b)
else:
print('你想输出菲波那切数列的第n个数的值为1:')
fibo_n1()
法三:利用递归输出菲波那切数列进行判断
def recur_fibo(n):
if n<=1:
return n
else:
return (recur_fibo(n-1)+recur_fibo(n-2))
def fibo_num2():
num=int(input('您要输出第几项?:'))
print('第{}项为:{}'.format(num,recur_fibo(num)))
fibo_num2()
结果:
- 输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
法一
for i in range(1,10):
for j in range(1,i+1):
print('{}*{}={}'.format(j,i,j*i),end=' || ')
print()
法二:利用format ,代码更加易读
for i in range(1,10):
for j in range(1,i+1):
print('{}*{}={}'.format(j,i,j*i),end=' || ')
print()
法三:
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%d'%(j,i,j*i),end=' || ')
print()
结果:
- 这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
分析:大+中+小=100
大 * 3 + 中 * 2 + 2*小 * 1
大:最多100//3
中:最多50
小:最多100
for big in range(1,100//3+1):
for middle in range(1,51):
small=100-big-middle
if big*3+middle*2+small*0.5==100 and big+middle+small==100:
print('大中小分别为:{},{},{}'.format(big,middle,small))
法二:三循环
horse={'big':3,'middle':2,'small':0.5}
count1,count2,count3=0,0,0
for big in range(1,100//3+1):
for middle in range(1,51):
for small in range(2,101,2):
if big * 3 + middle * 2 + small * 0.5 == 100 and big + middle + small == 100:
print('大中小分别为:{},{},{}'.format(big, middle, small))
结果: