1.求和
编写代码,实现整数序列求和。用户输入一个正整数N,计算从1到N(包含1和N)相加之后的结果。
1.用input()函数接收用户输入的正整数n,并将其转换为整数类型;
2.初始化一个变量sum为0:
3.使用for循环和range()函数从1遍历到n(包含n):
4.循环结束后,使用print()函数输出sum变量的值作为从1到n的整数序列求和结果。
n = input("请输入整数 N:")
sum = 0
for i in range(int(n)):
sum += i + 1
print("1 到 N 之和 :", sum)
输出结果
请输入整数 N:12
1 到 N 之和 : 78
2.九九乘法表
九九从乘法表输出。工整打印输出常用的九九乘法表,格式不限。
1.使用两个嵌套的for循环来生成九九乘法表;
2.外层循环变量i从1遍历到9,表示乘法表的行;内层循环变量j从1遍历到i,表示乘法表的列;
3.在每次内层循环中,使用print()函数输出当前的乘法结果,并使用format方法对乘法结果进行格式化;
4.当内层循环结束后,使用print()函数输出一个换行符,以便开始新的一行。
for i in range(1,10):
for j in range(1,i+1):
print("{}*{}={:2} ".format(j,i,i*j), end='')
print('')
输出结果
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
3.星期计算器
1.定义一周的星期
2.输出星期编号及对应的星期。
3.提示用户输入星期编号
4.将输入的星期编号转换为整数
5.提示用户输入经过的天数
6.将输入的天数转换为整数
7.计算经过n天后的星期几
8.获取今天和未来的星期几
9.输出结果
# 定义一周的星期
week_days = "日一二三四五六"
# 输出星期编号及对应的星期
print("星期编号及对应的星期如下:")
for i, day in enumerate(week_days):
print(f"{i}: 星期{day}")
# 提示用户输入星期编号
start_index_str = input("今天是星期几? 请输入星期编号(0-6):")
# 将输入的星期编号转换为整数
start_index = int(start_index_str)
# 提示用户输入经过的天数
days_after_str = input("经过多少天后? 请输入天数:")
# 将输入的天数转换为整数
days_after = int(days_after_str)
# 计算经过n天后的星期几
end_index = (start_index + days_after) % 7
# 获取今天和未来的星期几
today_day = week_days[start_index]
future_day = week_days[end_index]
# 输出结果
print(f"今天是星期{today_day}, 经过{days_after}天后是星期{future_day}")
输出结果
星期编号及对应的星期如下:
0: 星期日
1: 星期一
2: 星期二
3: 星期三
4: 星期四
5: 星期五
6: 星期六
今天是星期几? 请输入星期编号(0-6):1
经过多少天后? 请输入天数:5
今天是星期一, 经过5天后是星期六
4.圆面积计算器
1、获取用户输入的圆的半径
2、π的取值
3、计算圆的面积
4、计算圆的直径
5、输出结果
radius = float(input("请输入圆的半径: ")) # 获取用户输入的圆的半径
pi = 3.14 # π的取值
area = pi * radius ** 2 # 计算圆的面积
diameter = 2 * radius # 计算圆的直径
print(f"圆的直径是: {diameter:.2f}") # 输出结果 使用:.2f格式化输出,保留两位小数
print(f"圆的面积是: {area:.2f}")
输出结果
请输入圆的半径: 3
圆的直径是: 6.00
圆的面积是: 28.26
5.海里计算器
1、获取用户输入公里数
2、利用公式计算折算后结果
3、输出结果
k = eval(input("请输入公里数:"))
h = k/1.852
print("折算后的海里数为:",h,"海里")
输出结果
请输入公里数:123
折算后的海里数为: 66.41468682505399 海里
6.绘制六角形
六角形的绘制。利用turtle库绘制一个六角形。
from turtle import *
up()
setpos(-150,20)
down()
left(30)
fd(100)
left(60)
for i in range(5):
fd(100)
right(120)
fd(100)
left(60)
fd(100)
right(120)
fd(100)
for n in range(6):
fd(100)
right(60)
输出结果
![]()
7.天天向上的力量
1.定义变量dayup并赋予初始值1.0;定义变量dayfactor表示每天的提升量,并赋初始值为0.01;
2.创建for循环,设置循环次数为365;
3.通过if-else语句实现分支,判断是否为周末,若为周末,能力值下降0.01,否则能力值上升0.01;
4.输出结果。
dayup, dayfactor = 1.0, 0.01
for i in range(365):
if i % 7 in [6, 0]:
dayup = dayup * (1 - dayfactor)
else:
dayup = dayup * (1 + dayfactor)
print("向上5 天向下2 天的力量: {:.2f}.".format(dayup))
输出结果
向上5 天向下2 天的力量: 4.63.
8.恺撒密码的加密算法程序
1.获取用户输入的明文信息;
2.创建for循环,从明文信息中逐一取出字符等待转换;
3.利用分支结构,判断用户输入明文字符是否在字母a-z这个区间;如果在该区间,进行转换并输出;否则,直接将字符输出。
plaincode = input("请输入明文: ")
for p in plaincode:
if "a" <= p <= "z":
print(chr(ord("a") + (ord(p)-ord("a")+3)%26), end="")
else:
print(p, end="")
输出结果
请输入明文: axa
dad
9.取三位数的数字
1.获取用户输入的三位数;
2.利用运算操作符进行计算,得到每一位上的数字,并赋值给不同的变量;
3.利用格式化处理—format()输出结果。
x = int(input("请输入一个三位数:"))
a = x // 100
b = x // 10 % 10
c = x % 10
print("这个三位数的百位是{},十位是{},个位是{}。".format(a,b,c))
输出结果
请输入一个三位数:156
这个三位数的百位是1,十位是5,个位是6。
10.回文数判断
1.创建while循环;
2.获取用户输入的数据;
3.通过if-elif-else语句实现外层分支,判断数字是否为五位数或[‘e’,‘E’],否则输出相应的提示信息;
4.通过if-else语句实现内层分支,判断数字是否为回文数,并进行相应输出。
while 1:
hui=input("请输入一个五位数或用 e 退出:")
if len(hui) == 5 :
if eval(hui)==eval(hui[-1:]+hui[3:4]+hui[2:3]+hui[1:2]+hui[0:1]):
print("这是一个回文数")
else:
print("这不是一个回文数")
elif hui[-1:] in ['e','E']:
break
else:
print("您的输入有误")
输出结果
请输入一个五位数或用 e 退出:12321
这是一个回文数
11.猜数游戏
1.调用random库中randint函数;
2.利用randint()函数生成一个0-9之间的整数,并赋值给变量num;
3.创建while循环;
4.获取用户输入的猜测数据;
5.通过if-elif-else语句实现分支,若输入大于预设数,显示“遗憾,太大了”;小于则显示“遗憾,太小了”。循环直至猜中,输出“预测N次,你猜中了!”(N为用户输入次数)。
from random import randint
num=randint(1,10)
tim=0
while 1:
try:
putnum = eval(input("请输入您猜测的数字:"))
tim += 1
if putnum > num:
print("遗憾!太大了")
elif putnum < num:
print("遗憾!太小了")
elif putnum == num:
print("预测{}次,你猜中了!".format(tim))
break
except:
print("输入有误!")
输出结果
请输入您猜测的数字:5
遗憾!太小了
请输入您猜测的数字:7
预测2次,你猜中了!
12.最大公约数和最小公倍数计算
1.获取用户输入的两个数据,并赋值给变量a和b;
2.定义两个中间变量;
3.利用循环结构,得到两个数据的最大公约数和最小公倍数;
4.利用格式化输出打印出最终结果。
a,b = eval(input("请输入两个整数,中间用,隔开:"))
c = a*b
x = a % b
while (x != 0):
a = b
b = x
x = a % b
print("最大公约数为:{},最小公倍数为:{}".format(b,c//b))
输出结果
请输入两个整数,中间用,隔开:2,3
最大公约数为:1,最小公倍数为:6
13.BMI计算
1.获取用户输入的身高和体重数据;
2.利用运算操作符计算,BMI的值;
3.结合教材中表4.2提供的BMI指标分类值,利用分支结构,进行分类;
4.利用格式化处理—format()输出结果。
height, weight = eval(input("请输入身高(米)和体重\(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI 数值为:{:.2f}".format(bmi))
wto, dom = "", ""
if bmi < 18.5:
wto, dom = "偏瘦", "偏瘦"
elif 18.5 <= bmi < 24:
wto, dom = "正常", "正常"
elif 24 <= bmi < 25:
wto, dom = "正常", "偏胖"
elif 25 <= bmi < 28:
wto, dom = "偏胖", "偏胖"
elif 28 <= bmi < 30:
wto, dom = "偏胖", "肥胖"
else:
wto, dom = "肥胖", "肥胖"
print("BMI 指标为:国际'{0}', 国内'{1}'".format(wto, dom))
输出结果
请输入身高(米)和体重(公斤)[逗号隔开]: 1.81,78
BMI 数值为:23.81
BMI 指标为:国际’正常’, 国内’正常’
14.简易计算器的设计
1.首先定义4个函数分别实现两个数的加法、减法、乘法和除法运算,并输出运算结果;
2.然后输入两个参与运算的数和运算符;
3.最后根据运算符调用相应的函数。
#定义加法函数
def add(x,y):
print('{}+{}={}'.format(x,y,x+y))
#定义减法函数
def sub(x,y):
print('{}-{}={}'.format(x,y,x-y))
#定义乘法函数
def division(x,y):
print('{}*{}={}'.format(x, y,x * y))
#定义除法函数
def multiplication(x,y):
if y == 0:
print('除数不能为0!')
else:
print('{}/{}={}'.format(x, y, x/y))
x=float(input('请输入第一个数:'))
sign=input('请输入运算符:')
y=float(input('请输入第二个数:'))
if sign=='+':
add(x,y)
elif sign =='-':
sub (x,y)
elif sign == '*':
division(x, y)
elif sign =='/':
multiplication(x, y)
输出结果
请输入第一个数:1
请输入运算符:+
请输入第二个数:2
1.0+2.0=3.0
15.实现isPrime()函数,参数为整数,要有异常处理。
1.定义isPrime()函数,该函数接收一个整数num作为参数;
2.使用try-except块捕获异常,在try语句中使用type方法检查输入是否为整数,如果不是整数,则抛出TypeError异常;
3.质数判断:如果输入的整数等于1,则直接返回False,因为质数定义为大于1的自然数;
4.使用for循环从2遍历到sqrt(num)(加1以确保包含整数部分),检查是否存在能整除n的数。如果存在,则返回False;
5.如果循环结束都没有找到能整除n的数,则返回True,表示n是质数。
6.使用测试用例调用isPrime()函数检验函数功能。
import math
def isPrime(num):
try :
if type(num)==type(0.1):
raise TypeError
r= int(math.floor(math.sqrt(num)))
except TypeError:
print('不是一个有效的整数')
return None
if num==1:
return False
for i in range(2,r+1):
if num%i==0:
return False
return True
print(isPrime(2))
print(isPrime(44))
print(isPrime('str'))
print(isPrime(1))
print(isPrime(3.3))
print(isPrime(0x18))
输出结果
True
False
不是一个有效的整数
None
False
不是一个有效的整数
None
False
16.编写函数fun(n),返回整数 n每一位上数字的和。
1.定义函数fun()函数,该函数接收一个整数n作为参数;
2.使用while循环迭代n的每一位数字,并将其累加到total变量中;
3.在每次迭代中,使用n % 10获取n的当前最低位数字,并将其加到total上;
4.使用n //= 10去除n的当前最低位数字,当n变为0时,循环结束,函数返回total作为结果;
5.定义一个空列表result_list用于存储满足条件的整数;
6.使用for循环遍历1至10000之间的所有整数,对于每个整数i,调用fun(i)函数检查其每一位数字的和是否为15,如果是,则将i添加到result_list列表中;
7.最后,打印满足条件的整数列表及其个数。
def fun(n):
"""返回整数n每一位上数字的和"""
total = 0
while n > 0:
total += n % 10
n //= 10
return total
# 用于存储满足条件的整数
result_list = []
# 遍历1至10000之间的所有整数
for i in range(1, 10001):
if fun(i) == 15:
result_list.append(i)
# 输出满足条件的整数及其个数
print("满足条件的整数有:", result_list)
print("满足条件的整数的个数为:", len(result_list))
输出结果
满足条件的整数有: [69, 78, 87, 96, 159, 168, 177, 186, 195, 249, 258, 267, 276, 285, 294, 339, 348, 357, 366, 375, 384, 393, 429, 438, 447, 456, 465, 474, 483, 492, 519, 528, 537, 546, 555, 564, 573, 582, 591, 609, 618, 627, 636, 645, 654, 663, 672, 681, 690, 708, 717, 726, 735, 744, 753, 762, 771, 780, 807, 816, 825, 834, 843, 852, 861, 870, 906, 915, 924, 933, 942, 951, 960, 1059, 1068, 1077, 1086, 1095, 1149, 1158, 1167, 1176, 1185, 1194, 1239, 1248, 1257, 1266, 1275, 1284, 1293, 1329, 1338, 1347, 1356, 1365, 1374, 1383, 1392, 1419, 1428, 1437, 1446, 1455, 1464, 1473, 1482, 1491, 1509, 1518, 1527, 1536, 1545, 1554, 1563, 1572, 1581, 1590, 1608, 1617, 1626, 1635, 1644, 1653, 1662, 1671, 1680, 1707, 1716, 1725, 1734, 1743, 1752, 1761, 1770, 1806, 1815, 1824, 1833, 1842, 1851, 1860, 1905, 1914, 1923, 1932, 1941, 1950, 2049, 2058, 2067, 2076, 2085, 2094, 2139, 2148, 2157, 2166, 2175, 2184, 2193, 2229, 2238, 2247, 2256, 2265, 2274, 2283, 2292, 2319, 2328, 2337, 2346, 2355, 2364, 2373, 2382, 2391, 2409, 2418, 2427, 2436, 2445, 2454, 2463, 2472, 2481, 2490, 2508, 2517, 2526, 2535, 2544, 2553, 2562, 2571, 2580, 2607, 2616, 2625, 2634, 2643, 2652, 2661, 2670, 2706, 2715, 2724, 2733, 2742, 2751, 2760, 2805, 2814, 2823, 2832, 2841, 2850, 2904, 2913, 2922, 2931, 2940, 3039, 3048, 3057, 3066, 3075, 3084, 3093, 3129, 3138, 3147, 3156, 3165, 3174, 3183, 3192, 3219, 3228, 3237, 3246, 3255, 3264, 3273, 3282, 3291, 3309, 3318, 3327, 3336, 3345, 3354, 3363, 3372, 3381, 3390, 3408, 3417, 3426, 3435, 3444, 3453, 3462, 3471, 3480, 3507, 3516, 3525, 3534, 3543, 3552, 3561, 3570, 3606, 3615, 3624, 3633, 3642, 3651, 3660, 3705, 3714, 3723, 3732, 3741, 3750, 3804, 3813, 3822, 3831, 3840, 3903, 3912, 3921, 3930, 4029, 4038, 4047, 4056, 4065, 4074, 4083, 4092, 4119, 4128, 4137, 4146, 4155, 4164, 4173, 4182, 4191, 4209, 4218, 4227, 4236, 4245, 4254, 4263, 4272, 4281, 4290, 4308, 4317, 4326, 4335, 4344, 4353, 4362, 4371, 4380, 4407, 4416, 4425, 4434, 4443, 4452, 4461, 4470, 4506, 4515, 4524, 4533, 4542, 4551, 4560, 4605, 4614, 4623, 4632, 4641, 4650, 4704, 4713, 4722, 4731, 4740, 4803, 4812, 4821, 4830, 4902, 4911, 4920, 5019, 5028, 5037, 5046, 5055, 5064, 5073, 5082, 5091, 5109, 5118, 5127, 5136, 5145, 5154, 5163, 5172, 5181, 5190, 5208, 5217, 5226, 5235, 5244, 5253, 5262, 5271, 5280, 5307, 5316, 5325, 5334, 5343, 5352, 5361, 5370, 5406, 5415, 5424, 5433, 5442, 5451, 5460, 5505, 5514, 5523, 5532, 5541, 5550, 5604, 5613, 5622, 5631, 5640, 5703, 5712, 5721, 5730, 5802, 5811, 5820, 5901, 5910, 6009, 6018, 6027, 6036, 6045, 6054, 6063, 6072, 6081, 6090, 6108, 6117, 6126, 6135, 6144, 6153, 6162, 6171, 6180, 6207, 6216, 6225, 6234, 6243, 6252, 6261, 6270, 6306, 6315, 6324, 6333, 6342, 6351, 6360, 6405, 6414, 6423, 6432, 6441, 6450, 6504, 6513, 6522, 6531, 6540, 6603, 6612, 6621, 6630, 6702, 6711, 6720, 6801, 6810, 6900, 7008, 7017, 7026, 7035, 7044, 7053, 7062, 7071, 7080, 7107, 7116, 7125, 7134, 7143, 7152, 7161, 7170, 7206, 7215, 7224, 7233, 7242, 7251, 7260, 7305, 7314, 7323, 7332, 7341, 7350, 7404, 7413, 7422, 7431, 7440, 7503, 7512, 7521, 7530, 7602, 7611, 7620, 7701, 7710, 7800, 8007, 8016, 8025, 8034, 8043, 8052, 8061, 8070, 8106, 8115, 8124, 8133, 8142, 8151, 8160, 8205, 8214, 8223, 8232, 8241, 8250, 8304, 8313, 8322, 8331, 8340, 8403, 8412, 8421, 8430, 8502, 8511, 8520, 8601, 8610, 8700, 9006, 9015, 9024, 9033, 9042, 9051, 9060, 9105, 9114, 9123, 9132, 9141, 9150, 9204, 9213, 9222, 9231, 9240, 9303, 9312, 9321, 9330, 9402, 9411, 9420, 9501, 9510, 9600]
满足条件的整数的个数为: 592
17.编写函数绘制七段数码管。
1.定义drawGap 的函数,用于绘制数码管间隔;
2.定义drawLine函数,绘制单段数码管;
3.定义drawDigit函数,根据输入的数字d绘制七段数码管。
4.定义drawDate函数,根据参数传入的日期字符串绘制出对应的七段数码管数字,并在特定符号处显示中文字符“年”、“月”、“日”。
5.定义main函数,设置画布大小、位置,将画笔移动到起始位置并设置画笔粗细,使用datetime模块获取当前日期并格式化为YYYY-mm=dd+的形式,调用drawDate函数绘制日期。
6.调用main函数,执行程序。
#e7.2DrawSevenSegDisplay.py
import turtle, datetime
def drawGap(): #绘制数码管间隔
turtle.penup()
turtle.fd(5)
def drawLine(draw): #绘制单段数码管
drawGap()
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(d): #根据数字绘制七段数码管
drawLine(True) if d in [2,3,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,1,3,4,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,6,8] else drawLine(False)
turtle.left(90)
drawLine(True) if d in [0,4,5,6,8,9] else drawLine(False)
drawLine(True) if d in [0,2,3,5,6,7,8,9] else drawLine(False)
drawLine(True) if d in [0,1,2,3,4,7,8,9] else drawLine(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawDate(date):
turtle.pencolor("red")
for i in date:
if i == '-':
turtle.write('年',font=("Arial", 18, "normal"))
turtle.pencolor("green")
turtle.fd(40)
elif i == '=':
turtle.write('月',font=("Arial", 18, "normal"))
turtle.pencolor("blue")
turtle.fd(40)
elif i == '+':
turtle.write('日',font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main():
turtle.setup(800, 350, 200, 200)
turtle.penup()
turtle.fd(-350)
turtle.pensize(5)
drawDate(datetime.datetime.now().strftime('%Y-%m=%d+'))
turtle.hideturtle()
main()
输出结果
![]()
18.汉诺塔的移动函数
1.定义 hanoi函数实现汉诺塔问题;
2.如果盘子数量n为1,直接将盘子从源柱src移动到目标柱dst,并计数加1。
3.如果盘子数量n大于1,先将 n-1 个盘子从源柱 src 移动到辅助柱 mid,再将第n个盘子从源柱src移动到目标柱 dst,最后将n-1个盘子从辅助柱 mid 移动到目标柱dst;
3.调用hanoi函数。
count = 0
def hanoi(n, src, dst, mid):
global count
if n == 1 :
print("{}:{}->{}".format(1,src,dst))
count += 1
else :
hanoi(n-1, src, mid, dst)
print("{}:{}->{}".format(n,src,dst))
count += 1
hanoi(n-1, mid, dst, src)
hanoi(3, "A", "C", "B")
print(count)
输出结果
1:A->C
2:A->B
1:C->B
3:A->C
1:B->A
2:B->C
1:A->C
7
19.万年历
编写函数实现万年历,通过输入某年某月,打印出当月日历功能。
1.定义is_leap_year()函数,判断是否为闰年;
2.定义get_num_of_days_in_month()函数,获得每月的天数;
3.定义get_total_num_of_day()函数,获得从1800年1月1日以来经过的天数;
4.定义get_start_day()函数,获得每月1日为星期几;
5.定义get_month_name()函数,获得每月的名称;
6.定义print_month_title()函数,打印日历标题与头部部分;
7.定义print_month_body()函数,打印日历的数字部分。
8.调用函数检验函数功能。
#定义月份与名称对应的字典 month_dict。
#月份与名称对应的字典
month_dict = {1:'January', 2:'February', 3: 'March', 4:'April', 5:'May', 6:'June', 7:'July', 8:'August', 9: 'Septenber', 10:'October', 11:'Novenber', 12:'Decenber'}
#is_leap_year(year)函数判断是否为闰年。
def is_leap_year(year):
#判断是否为闰年
if year%4 == 0 and year%100!= 0 or year%400 == 0:
return True
else:
return False
#get_num_of_days_in_month (year, month)函数获得每月的天数。
def get_num_of_days_in_month(year, month):
#给定年月返回月份的天数
if month in (1, 3, 5, 7, 8,10, 12):
return 31
elif month in (4, 6, 9, 11):
return 30
elif is_leap_year(year):
return 29
else:
return 28
#get_total_num_of_days (year, month)函数获得自1800年1月1日以来经过的天数。
def get_total_num_of_day(year, month):
#自1800年1月1日以来过了多少天
days = 0
for y in range(1800, year):
if is_leap_year(y):
days += 366
else:
days += 365
for m in range(1, month):
days += get_num_of_days_in_month(year, m)
return days
def get_start_day(year, month):
#返回当月1日是星期几,由1800.01.01是星期三推算
return (3 + get_total_num_of_day(year, month))%7
#get_month_name (month)函数获得每月的名称。
def get_month_name(month):
#返回当月的名称
return month_dict[month]
#print_month_title(year, month) 两数打印日历标题与头部部分
def print_month_title(year, month):
#打印日历的头部print('
print (' ',get_month_name(month),' ',year,' ')
print('---------------------------------------------')
print (' Sun Mon Tue Wed Thu Fri Sat ')
#print_month_body (year, month)函数打印日历的数字部分
def print_month_body(year, month):
#打印日历正文
#格式说明:每天的长度为5
i = get_start_day(year, month)
print(' '* i, end='') #每月1日从星期几开始,则空5*几个空格
for j in range(1, get_num_of_days_in_month(year, month)+ 1):
print('%5d'%j, end='') #宽度控制,4+1-5
i+= 1
if i%7==0: #i用于计数和换行
print('') #每换行一次,行首继续加空格
#以下是主函数部分
year = int(input("please input target year:"))
month = int(input("Please input target month:"))
print_month_title(year, month)
print_month_body(year, month)
print()
#输出结果
please input target year:2025
Please input target month:5
May 2025
---------------------------------------------
Sun Mon Tue Wed Thu Fri Sat
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
20.计算多数据基本统计值
1.定义getNum()函数,从用户处获取一组数字输入,直到用户输入空行(直接按回车)为止;
2.定义mean()函数,遍历列表 numbers,计算一组数字的平均值;
3.定义dev()函数,遍历列表 numbers,计算一组数字的样本标准差(方差的平方根)。
4.定义median()函数,使用 sorted(numbers) 对数字列表进行排序,计算一组数字的中位数。
5.调用上述函数完成统计值计算并输出结果。
from math import sqrt
def getNum(): #获取用户不定长输入
nums = []
iNumStr = input("请输入数字(直接输入回车退出): ")
while iNumStr != "":
nums.append(eval(iNumStr))
iNumStr = input("请输入数字(直接输入回车退出): ")
return nums
def mean(numbers): #计算平均值
s = 0.0
for num in numbers:
s = s + num
return s / len(numbers)
def dev(numbers, mean): #计算方差
sdev = 0.0
for num in numbers:
sdev = sdev + (num - mean)**2
return sqrt(sdev / (len(numbers)-1))
def median(numbers): #计算中位数
sorted(numbers)
size = len(numbers)
if size % 2 == 0:
med = (numbers[size//2-1] + numbers[size//2])/2
else:
med = numbers[size//2]
return med
n = getNum() #主体函数
m = mean(n)
print("平均值:{},方差:{:.2},中位数:{}.".format(m, dev(n,m), median(n)))
输出结果
请输入数字(直接输入回车退出): 1
请输入数字(直接输入回车退出): 2
请输入数字(直接输入回车退出): 3
请输入数字(直接输入回车退出):
平均值:2.0,方差:1.0,中位数:2.
21.武林大侠武功属性得分表
1.数据定义:定义一维列表attrs,存储6个属性名称,分别是“筋骨”、“敏捷”、“气势”、“反应”、“技巧”和“内力”,定义二维列表,存储5位大侠及其对应的6个属性评分;
2.计算每位大侠的总得分,并将结果存储为一个包含元组的列表;
3.计算每个属性的平均分,并将结果存储到列表 avgs 中;
4.格式化输出每个属性的平均分;
5.按总得分从高到低对大侠进行排序,并输出排名。
#武侠属性评分统计
#计算每位大侠的总得分
attrs = ["筋骨","敏捷","气势","反应","技巧","内力"]
tables = [['萧峰',20, 17, 20, 20, 18, 19],
['杨过',18, 19, 17, 20, 18, 18],
['令狐冲',12,17, 14, 20, 19, 13],
['张无忌',20, 17, 15, 14, 20, 20],
['郭靖',19, 18, 19, 18, 19, 20]]
totals = [(item[0], sum(item[1:])) for item in tables]
#生成各个属性平均分列表avgs
avgs=[]
for j in range(1, 6+1): #对 tables 表中第1列~第6列进行平均值计算
avgs.append(sum([tables[i][j] for i in range(5)])/5)
#输出不同属性的平均分
print ("\n不同属性的平均分是:")
for i in range(6):
print ("{:<3}:{:>4}".format(attrs[i], avgs[i]))
# 由高到低输出大侠的总得分
totals.sort(key = lambda x:x[1], reverse = True)
print ("\n五位大侠的总分是:")
for item in totals:
print("{:<3}:{:>4}".format(item[0], item[1]))
输出结果
不同属性的平均分是:
筋骨 :17.8
敏捷 :17.6
气势 :17.0
反应 :18.4
技巧 :18.8
内力 :18.0五位大侠的总分是:
萧峰 : 114
郭靖 : 113
杨过 : 110
张无忌: 106
令狐冲: 95
21.歌唱比赛
1.按照前面“由评委组的十名评委打分”的描述,需要找一个列表记录每个评委的分数,此时列表中的元素是没有顺序的;
2.找出列表中的最高分和最低分,也就是先使用sort()方法按从低到高的顺序排列列表元素,此时列表中位于开头的元素为最低分,位于结尾的元素为最高分;
3.去掉最低分和最高分相当于删除列表的头尾元素,可借助remove()方法删除列表的首位元素,借助pop()方法删除列表的尾部元素,此时列表中的元素是计算得分需要的列表;
4.计算得分操作也就是遍历列表求和、求平均数。
#评分列表
score_li = []
#总分
total_score = 0
for i in range(1,11):
score = float(input(f"请第{i}位评委输入评分:\n"))
score_li.append(score)
score_li.sort()
print(f"去掉最低分:{score_li[0]}")
print(f"去掉最高分:{score_li[len(score_li)-1]}")
#去掉最低分
score_li.remove(score_li[0])
#去掉最高分
score_li.pop()
for j in score_li:
total_score += j
print(f'选手最终得分为:{total_score/(len(score_li))}')
输出结果
请第1位评委输入评分:
9
请第2位评委输入评分:
8
请第3位评委输入评分:
9
请第4位评委输入评分:
6
请第5位评委输入评分:
8
请第6位评委输入评分:
9
请第7位评委输入评分:
7
请第8位评委输入评分:
9
请第9位评委输入评分:
7
请第10位评委输入评分:
9
去掉最低分:6.0
去掉最高分:9.0
选手最终得分为:8.25
22.《三国演义》人物出场统计
1.导入jieba中文分词库;
2.定义一个集合excludes,排除无意义的词或高频但无分析价值的词列表;
3.读取threekingdoms.txt文件的内容,并使用jieba.lcut(txt)对文本进行分词处理,得到一个包含所有分词的列表words;
4.定义一个字典counts,用于统计每个词及其出现的次数;
5.使用sort()方法排序并打印出现频率最高的10个词。
#e10.3CalThreeKingdoms.py
import jieba
excludes={"将军","却说","荆州","二人","不可","不能","如此",
"商议","如何","主公","军士","左右","军马","引兵",
"次日","大喜","天下","东吴","于是","今日","不敢","魏兵",
"陛下","一人","都督","人马","不知"}
txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len(word) == 1: #排除单个字符的分词结果
continue
elif word=="诸葛亮" or word=="孔明曰":
rword="孔明"
elif word=="关公" or word=="云长":
rword="关羽"
elif word=="玄德" or word=="玄德曰":
rword="刘备"
elif word=="孟德" or word=="丞相":
rword="曹操"
else:
rword=word
counts[rword] = counts.get(rword,0) + 1
for word in excludes:
del(counts[word])
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(10):
word, count = items[i]
print ("{0:<10}{1:>5}".format(word, count))
输出结果
Building prefix dict from the default dictionary …
Loading model from cache C:\Users\lenovo\AppData\Local\Temp\jieba.cache
Loading model cost 0.616 seconds.
Prefix dict has been built successfully.
曹操 1451
孔明 1383
刘备 1252
关羽 784
张飞 358
吕布 300
赵云 278
孙权 264
司马懿 221
周瑜 217
23.制作巴黎奥运会前5奖牌榜
1.首先定义列表medal保存东京奥运会奖牌数前5的国家或运动队的奖牌数,列表元素为字典类型,以国家名或运动队名为键,以奖牌数的字典为值;
2.然后定义函数ranking(base)(base为金牌数或奖牌总数,表示排序依据),在其中使用sort()方法对medal进行降序排序,并使用lambda函数作为参数key的值,遍历列表,输出排名和奖牌数;
3.最后分别使用“金牌”和“总数”作为参数两次调用ranking()函数。
meda1=[{'中国':{'金牌':40,'银牌':27,'铜牌':24,'总数':91}},
{'法国':{'金牌':16,'银牌':26,'铜牌':22,'总数':64}},
{'澳大利亚':{'金牌':18,'银牌':19,'铜牌':16,'总数':53}},
{'美国':{'金牌':40,'银牌':44,'铜牌':42,'总数':126}},
{'日本':{'金牌':20,'银牌':12,'铜牌':13,'总数':45}}]
#定义函数,对奖牌数进行排序
def ranking(base):
print('*****巴黎奥运会前5奖牌榜(按{}排名)*****'.format(base))
#按降序排序
meda1.sort (key=lambda x:list (x.values ())[0][base], reverse=True)
i =1
for country in meda1: #遍历列表
for key,value in country.items(): #遍历字典
print(i,key,'金牌',value['金牌'],'银牌',value['银牌'],'铜牌',value['铜牌'],'总数',value['总数'])
i+=1
ranking('金牌')
#按金牌数排序#按奖牌总数排序
ranking('总数')
输出结果
巴黎奥运会前5奖牌榜(按金牌排名)
1 中国 金牌 40 银牌 27 铜牌 24 总数 91
2 美国 金牌 40 银牌 44 铜牌 42 总数 126
3 日本 金牌 20 银牌 12 铜牌 13 总数 45
4 澳大利亚 金牌 18 银牌 19 铜牌 16 总数 53
5 法国 金牌 16 银牌 26 铜牌 22 总数 64
巴黎奥运会前5奖牌榜(按总数排名)
1 美国 金牌 40 银牌 44 铜牌 42 总数 126
2 中国 金牌 40 银牌 27 铜牌 24 总数 91
3 法国 金牌 16 银牌 26 铜牌 22 总数 64
4 澳大利亚 金牌 18 银牌 19 铜牌 16 总数 53
5 日本 金牌 20 银牌 12 铜牌 13 总数 45
24.学生选课问题
1.用字典定义选修课程的学生名单;
2.计算总选课学生数;
3.计算没有选课的学生数量;
4.初始化课程列表,将三门课程的集合存储在一个列表中;
5.计算同时选修了2门课的学生数量;
6.计算同时选修了3门课的学生数量;
7.修正同时选修了2门课的学生数量;
8.计算只选修了1门课的学生数量,输出结果。
#选修课
course1={'李雷','张玉','王晓刚','陈红静','方向','司马清'}
course2={'施小冉','李芳芳','刘潇','方向','孙一航','黄煌'}
course3={'陈红静','方向','刘培良','张玉','施小冉','司马清'}
courses=course1.copy()
courses.update(course2)
courses.update(course3)
cnt=len(courses)
cntNo=25-cnt
cours=[course1,course2,course3]
cnt2=0
for i in range(3):
for j in range(i+1,3):
cnt2=cnt2+len(cours[i] & cours[j])
cnt3=len(course1 & course2 & course3)
cnt2=cnt2-3*cnt3
cnt1=cnt-cnt2-cnt3
print("cntNo=",cntNo)
print("cnt1=",cnt1)
print("cnt2=",cnt2)
print('cnt3=',cnt3)
输出结果
cntNo= 13
cnt1= 7
cnt2= 4
cnt3= 1