综合案例
案例1 输入若干个成绩,求所有成绩的平均分。每输入一个成绩后询问是否继续输入下一个成绩,回答“yes”就继续输入下一个成绩,回答“no”就停止输入成绩。
numbers = []
while True:
x = input('请输入一个成绩:')
#异常处理结构,用来保证用户只能输入实数
try:
#先把x转换成实数,然后追加到列表numbers尾部
numbers.append(float(x))
except:
print('不是合法成绩')
#下面的循环用来限制用户只能输入任意大小写的“yes”或者“no”
while True:
flag = input('继续输入吗?(yes/no)').lower()
if flag not in ('yes', 'no'):
print('只能输入yes或no')
else:
break
if flag=='no':
break
#计算平均分
print(sum(numbers)/len(numbers))
案例2 编写程序,判断今天是今年的第几天。
import time
date = time.localtime() #获取当前日期时间
year, month, day = date[:3]
day_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
if year%400==0 or (year%4==0 and year%100!=0): #判断是否为闰年
day_month[1] = 29
if month==1:
print(day)
else:
print(sum(day_month[:month-1])+day)
案例3 编写代码,输出由星号*组成的菱形图案,并且可以灵活控制图案的大小。
def main(n):
for i in range(n):
print((' * '*i).center(n*3))
for i in range(n, 0, -1):
print((' * '*i).center(n*3))
例4 快速判断一个数是否为素数。
n = input("Input an integer:")
n = int(n)
if n in (2,3):
print('Yes')
#偶数必然不是素数
elif n%2 == 0:
print('No')
else:
#大于5的素数必然出现在6的倍数两侧
#因为6x+2、6x+3、6x+4肯定不是素数,假设x为大于1的自然数
m = n % 6
if m!=1 and m!=5:
print('No')
else:
for i in range(3, int(n**0.5)+1, 2):
if n%i == 0:
print('No')
break
else:
print('Yes')
例5 编写程序,计算组合数C(n,i),即从n个元素中任选i个,有多少种选法。
根据组合数定义,需要计算3个数的阶乘,在很多编程语言中都很难直接使用整型变量表示大数的阶乘结果,虽然Python并不存在这个问题,但是计算大数的阶乘仍需要相当多的时间。本例提供另一种计算方法:以Cni(8,3)为例,按定义式展开如下,对于(5,8]区间的数,分子上出现一次而分母上没出现;(3,5]区间的数在分子、分母上各出现一次;[1,3]区间的数分子上出现一次而分母上出现两次。
看图比较实在。
def Cni(n, i):
if not (isinstance(n,int) and isinstance(i,int) and n>=i):
print('n and i must be integers and n must be larger than or equal to i.')
return
result = 1
Min, Max = sorted((i,n-i))
for i in range(n,0,-1):
if i>Max:
result *= i
elif i<=Min:
result //= i
return result
print(Cni(6,2))
例6 编写程序,输入一个自然数n,然后计算并输出前n个自然数的阶乘之和1!+2!+3!+…+n!的值。
n = int(input('请输入一个自然数:'))
#使用result保存最终结果,t表示每一项
result, t = 1, 1
for i in range(2, n+1):
#在前一项的基础上得到当前项
t *= i
#把当前项加到最终结果上
result += t
print(result)
例7 编写代码,模拟决赛现场最终成绩的计算过程。有至少3个评委,打分规则为删除最高分和最低分之后计算剩余分数的平均分。
while True:
try:
n = int(input('请输入评委人数:'))
if n <= 2:
print('评委人数太少,必须多于2个人。')
else:
break
except:
pass
scores = []
for i in range(n):
#这个while循环用来保证用户必须输入0到100之间的数字
while True:
try:
score = input('请输入第{0}个评委的分数:'.format(i+1))
#把字符串转换为实数
score = float(score)
assert 0<=score<=100
scores.append(score)
#如果数据合法,跳出while循环,继续输入下一个评委的分数
break
except:
print('分数错误')
#计算并删除最高分与最低分
highest = max(scores)
lowest = min(scores)
scores.remove(highest)
scores.remove(lowest)
finalScore = round(sum(scores)/len(scores),2)
formatter = '去掉一个最高分{0}\n去掉一个最低分{1}\n最后得分{2}'
print(formatter.format(highest, lowest, finalScore))
例8 编写程序,实现人机对战的尼姆游戏。
from random import randint
n = int(input('请输入一个正整数:'))
while n > 1:
#人类玩家先走
print("该你拿了,现在剩余物品数量为:{0}".format(n))
#确保人类玩家输入合法整数值
while True:
try:
num = int(input('输入你要拿走的物品数量:'))
#确保拿走的物品数量不超过一半
assert 1 <= num <= n//2
break
except:
print('最少必须拿走1个,最多可以拿走{0}个。'.format(n//2))
n -= num
if n == 1:
print('恭喜,你赢了!')
break
#计算机玩家随机拿走一些,randint()用来生成指定范围内的一个随机数
n -= randint(1, n//2)
else:
print('哈哈,你输了。')