程序的分支结构
单分支结构 if
1. #单条件判断 2. s = eval(input("请输入一个整数:")) 3. if s % 2 == 0: 4. print("%d是偶数。" % s)
1. #多条件判断 2. s = eval(input("请输入一个整数:")) 3. if s % 3 == 0 and s % 5 == 0: 4. print("%d既能被3整除,又能被5整除。" % s)
二分支结构 if-else
1. s = eval(input("请输入一个整数:")) 2. if s % 3 == 0 and s % 5 == 0: 3. print("%d既能被3整除,又能被5整除。" % s) 4. else: 5. print("%d不能同时被3和5整除。" % s)
1. s = eval(input("请输入一个整数:")) 2. token = ""if s % 3 == 0 and s % 5 == 0 else "不" 3. print("{}{}能同时被3和5整除。" .format(s, token))
多分支结构 if-elif-else 成绩分级 注意逻辑先后顺序关系
1. score = eval(input("请输入一个百分制成绩:")) 2. if score >= 90.0: 3. grade = 'A' 4. elif score >= 80.0: 5. grade = 'B' 6. elif score >= 70.0: 7. grad = 'C' 8. elif grad >= 60.0: 9. grad = 'D' 10. else: 11. grad = 'E' 12. print("对应的五分制成绩是:{}".format(grad))
判断条件及组合 >、>=、<、<=、==、!=、and、or、not
1. >>> 4<5 2. True 3. >>> 'Pyhon'>'python' 4. False 5. >>> 0==False 6. True 7. >>> ''==True 8. False 9. >>> not True 10. False 11. >>> a=80 12. >>> (a>100)or(a>50 and a<90) 13. True 14. >>>
示例分析1:多分支程序示例。根据月份计算该月的天数(不考虑闰年的情况)。
1. month = eval(input("请输入您选择的月份:")) 2. days = 0; 3. if (month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12): 4. 5. days = 31 6. elif (month == 4 or month == 6 or month == 9 or month == 11): 7. days = 30 8. else: 9. days = 28 10. print("{}月份的天数是{}天。".format(month, days))
示例分析2:多分支嵌套示例。例如,一个计算购书款的程序。如果有会员卡,购书5本以上,书款按7.5折结算,5本以下,按8.5折结算:如果没有会员卡,购书5本以上,书款按8.5折结算,5本以下,按9.5折结算。
1. flag = 1 2. books = 8 3. price = 234 4. actualpay = 0 5. 6. if flag == 1: 7. if books >= 5: 8. actualpay = price * books * 0.75 9. else: 10. actualpay = price * books * 0.85 11. else: 12. if books >= 5: 13. actualpay = price * books * 0.85 14. else: 15. actualpay = price * books * 0.95 16. print("您的实际付款金额是:{}".format(actualpay))
小作业:
1、输人一个年份,输出是否为闰年。#闰年条件:能被4整除但不能被100整除,或者能被400整除的年份都是闰年。
2、输入三个整数,按从大到小的顺序输出。
3、输入温度t的值,判断是否适合晨练。(25<=t<=30,则适合晨练ok,否则不适合no)
4、乘坐飞机时,当乘客行李小于等于20公斤时,按每公斤1.68元收费,大于20公斤时,按每公斤1.98元收费,编程计算收费(保留2位小数)。
5、根据从键盘上输入的表示星期几的数字,对应输出它的英文名称。Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday、input error!
6、一个最简单的计算器支持+,-,*,/四种运算。输入只有一行:两个参加运算的数和一个操作符(+,-,*,/)。输出运算表达式的结果。
考虑下面两种情况:(1)如果出现除数为0的情况,则输出:Divided by zero! (2)如果出现无效的操作符(即不为+,-,*,/之一),则输出:Invalid operator!
输入样例:34 56 + 输出样例:90
7、期末来临了,班长小Q决定将剩余班费X元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请您编一程序,帮小Q制订出一种买笔的方案。
【分析】对于以上的实际问题,要买尽量多的笔,易知都买4元的笔肯定可以买最多支笔。因此最多可买的笔为x div 4支。由于小q要把钱用完,故我们可以按以下方法将钱用完: 若买完x div 4支4元钱的笔,还剩1元,则4元钱的笔少买1支,换成一支5元笔即可;若买完x div 4支4元钱的笔,还剩2元,则4元钱的笔少买1支,换成一支6元笔即可;若买完x div 4支4元钱的笔,还剩3元,则4元钱的笔少买2支,换成一支5元笔和一支6元笔即可。
程序的循环结构
遍历循环 for
1. >>> for i in "python": 2. print(i) 3. p 4. y 5. t 6. h 7. o 8. n 9. >>> for i in range(5): 10. print(i) 11. 0 12. 1 13. 2 14. 3 15. 4
1. #for循环与else 2. for i in 'py': 3. print("循环执行中:" + i) 4. else: 5. print("循环正常结束")
无限循环 while
1. >>> n=0 2. >>> while n<10: 3. print(n) 4. n=n+3 5. 0 6. 3 7. 6 8. 9
循环示例1:将一个列表中的元素进行头尾置换,即列表中第1个元素和倒数1个元素交换,第2个元素和倒数第2个元素交换,依次进行,最后打印输出列表。
1. lst = [1, 3, 7, -23, 34, 0, 23, 2, 9, 7, 79] 2. 3. #用while循环做翻转 4. head = 0 5. tail = len(lst) - 1 6. while head < len(lst) / 2: 7. lst[head], lst[tail] = lst[tail], lst[head] 8. head += 1 9. tail -= 1 10. for i in lst: 11. print(i, end = " ") 12. print() 13. 14. #用for循环做翻转 15. tail = len(lst) - 1 16. n = int(len(lst) / 2) 17. for i in range(0,n): 18. lst[i], lst[tail-i] = lst[tail-i], lst[i] 19. for i in lst: 20. print(i, end = " ") 21. print()
循环示例2:使用嵌套循环计算1!+2+...+n!。
1. n = eval(input("请输入正整数n:")) 2. 3. #for循环嵌套 4. s = 0 5. for i in range(1, n + 1): 6. t = 1 7. for j in range(1, i + 1): 8. t *= j 9. s += t 10. print(s) 11. 12. #while循环嵌套 13. s = 0 14. i = 1 15. while i <= 10: 16. t = 1 17. j = 1 18. while j <= i: 19. t *= j 20. j += 1 21. s += t 22. i += 1 23. print(s)
循环当中的else语句:
1. #while和else 正常循环结束执行else 如果有break也会跳过else 2. s, idx = 'PYTHON', 0 3. while idx < len(s): 4. print("循环执行中:" + s[idx]) 5. idx += 1 6. else: 7. print("循环正常结束") 8. 9. #二重循环中的else语句:将100以内的素数加入列表 10. num = [] 11. i = 2 12. for i in range(2, 100): 13. j = 2 14. for j in range(2, i): 15. if i % j == 0: 16. break 17. else: 18. num.append(i) 19. print(num)
循环控制 break 和 continue
1. #单循环 break跳出循环 2. while True: 3. s = input("请输入一个名字(按Q退出):") 4. if s == "Q": 5. break 6. print("输入的名字是:{}".format(s)) 7. print("程序退出")
1. #多层循环,break退出最内层循环 2. while True: 3. s = input("请输入一个名字(按Q退出):") 4. if s == "Q": 5. break 6. for i in s: 7. if i == "E": 8. break 9. print(i, end = " ") 10. print("程序退出")
1. #不能结束循环 跳出本次循环 2. for s in "PYTHON": 3. if s == "Y": 4. continue 5. print(s, end = " ") 6. print("\n")
跳转示例break:求n的最大真约数。
1. a = eval(input("请输入一个整数:")) 2. i = int(a / 2) 3. while i > 0: 4. if a % i == 0: 5. break 6. i -= 1 7. print("{}的最大真约数是:{}".format(a, i))
跳转示例continue:输入6个整数,输出输入数值中正整数之和,忽略负数。
1. sum = 0 2. for i in range(6): 3. n = eval(input("请输入一个整数:")) 4. if n < 0: 5. continue 6. sum += n 7. print(sum)
流程控制实例1:蒙特卡罗方法计算圆周率
1. import random 2. NUM = 10000 3. n = 0 4. for i in range(NUM): 5. x = random.random() *2 - 1 6. y = random.random() *2 - 1 7. if ((x * x + y * y) <= 1): 8. n += 1 9. print("PI=%.5f" % (n *4.0 / 10000))
流程控制实例2:输出数字金字塔
1. n = eval(input("请输入正整数n:")) 2. for i in range(1, n + 1): 3. for j in range(1, n - i + 1): 4. print(end = " ") 5. for j in range(1, i + 1): 6. print((i - j + 1), end = "") 7. for j in range(2, i + 1): 8. print(j, end = "") 9. print()
小作业:
1、输入一个整数N,并计算1到N相加的和。
2、 利用for循环,分别计算1—100中奇数的和、偶数的和。
3、利用for循环计算n!的值。
4、 求s=1 +2 +3……+n,当加到第几项时,s的值会超过1000?
5、最大公约数计算。获得两个整数,求出这两个整数的最大公约数和最小公倍数。最大公约数的计算般使用辗转相除法,最小公倍数则使用两个数的乘积除以最大公约数。
6、 编一程序求满足不等式1+ 1/2 + 1/3 …+1/n >=5的最小n值。
7、 校体操队到操场集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分别按每行排4,5,6人,都多出1人;当排成每行7人时,正好不多。求校体操队至少多少人?
8、 对于给定的自然数n(n<20),在屏幕上输出仅由“*”构成的n行的直角三角形。 例如:当n=5时,输出:
*
* *
* * *
* * * *
* * * * *
9、百钱买百鸡问题。鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
10、 求100-999中的水仙花数。若三位数ABC,ABC=A3+B3+C3,则称ABC为水仙花数。 例如153,13+53+33=1+125+27=153,则153是水仙花数。
11、输出100—200中所有的素数。
12、输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)。
13、把一个合数分解成若干个质因数乘积的形式(即求质因数的过程)叫做分解质因数。分解质因数(也称分解素因数)只针对合数。输入一个正整数n,将n分解成质因数乘积的形式。输入样例:36 输出样例:36=2*2*3*3
【分析】 将任意的n分解为质因数的乘积,要从最小的质数开始,那么,我们就不妨从2开始试除,能整除就输出2,再对商继续试除,直到不再含有因子2;然后用下一个质数反复试除,……,再用下一个质数试除,……,一直到商为1,停止操作。这里,质因数的递增,是一层循环,每一个质因数的反复试除,又是一层循环。因此,本题使用两层循环来解决。
14、阶乘之和,输入n,计算S=1! + 2! + 3! + … + n!的末6位(不含前导0)。n<=106, n!表示前n个正整数之积。样例输入:10 样例输出:37913
程序的异常处理 try-except
1. #输入异常 2. >>> n=eval(input("请输入一个数字:")) 3. 请输入一个数字:python 4. Traceback (most recent call last): 5. File "<pyshell#0>", line 1, in <module> 6. n=eval(input("请输入一个数字:")) 7. File "<string>", line 1, in <module> 8. NameError: name 'python' is not defined
1. #输入异常处理 2. try: 3. n = eval(input("请输入一个数字:")) 4. print("{}的3次方为:{}".format(n, pow(n, 3))) 5. except: 6. print("输入有误,请重新输入!")
1. #执行异常 2. >>> for i in range(5): 3. print(10/i,end="") 4. Traceback (most recent call last): 5. File "<pyshell#6>", line 2, in <module> 6. print(10/i,end="") 7. ZeroDivisionError: division by zero
1. #执行异常处理 2. try: 3. for i in range(5): 4. print(10/i,end="") 5. except: 6. print("某种原因,出错了!")
1. #特定错误类型处理 2. try: 3. for i in range(5): 4. print(10/i,end="") 5. except ZeroDivisionError: 6. print("除数为零,产生除零错误!") 7. except: 8. print("某种原因,出错了!")
实例解析——猜数字游戏
1. import random 2. target = random.randint(1, 1000) 3. count = 0 4. while True: 5. guess = eval(input("请输入猜测的整数(1至1000):")) 6. count += 1 7. if guess > target: 8. print("大了!") 9. elif guess < target: 10. print("小了!") 11. else: 12. print("对了!") 13. break 14. print("本轮猜测的次数是:{}".format(count))
1. import random 2. target = random.randint(1, 1000) 3. count = 0 4. while True: 5. try: 6. guess = eval(input("请输入猜测的整数(1至1000):")) 7. except: 8. print("输入有误,请重新输入,本轮不计入猜测次数!") 9. continue 10. count += 1 11. if guess > target: 12. print("大了!") 13. elif guess < target: 14. print("小了!") 15. else: 16. print("对了!") 17. break 18. print("本轮猜测的次数是:{}".format(count))
小作业:
1.猜数游戏续。当用户输人的不是整數(如字母、浮点数等)时,程序会终止执行退出。改编题目1中的序,当用户输入出错时给出“输入内容必须为整数!"的提示,并让用户重新输人。
2.羊车门问题。有三扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门,露出门后的山羊,然后允许参赛者更换自己的选择。请问:参赛者更换选择后能否增加猜中汽车的机会?一这是 一个经典问题。请使用random库对这个随机事件进行预测,分别输出参赛者改变选择和坚持选择获胜的概率。