实验一
1. 实验目的
(1) 掌握Python数值类型数据、字符串的使用方法。
(2) 掌握将数学表达式转换成Python语言表达式的方法及注意事项,掌握有关运算符的使用方法。
(3) 掌握序列索引,掌握列表的创建和使用方法。
(4) 掌握字典的创建和使用方法。
2. 实验内容
(1) 把浮点数13.4转换成整数再转换成一个字符串并输出。
代码:
a = 13.4 b = int(a) c = str(b) print(a,b,c) print(type(c))结果
(2) 有一个字符串类型的变量name=”张海”,整型变量age=23,使用print()函数和%进行格式化输出,输出结果为“张海的年龄是23岁”。
代码:
name = "张海" age = 23 print("%s的年龄是%d岁" %(name,age))结果:
(3) 从键盘输入一个4位十进制整数,要求输出各位数字之和。
str_a = input("输入一个4位十进制整数:") if(len(str_a) == 4): int_a = int(str_a) else: print("你输入的格式不对") gewei = int_a%10 shiwei = (int_a//10)%10 baiwei = (int_a//100)%10 qianwei = int_a//1000 result = gewei + shiwei + baiwei + qianwei print(result)结果:
(4) 计算鸡兔同笼问题。已知鸡和兔的总数为h,鸡和兔的脚总数为f,计算鸡和兔分别有多少只?
h = int(input("请输入鸡和兔的总数:")) f = int(input("请输入鸡和兔的脚总数:")) #判断输入数据的合法性 valid = True if h <= 0: print("鸡和兔的总数必须是正整数!") valid = False elif f <= 0: print("脚的总数必须是正整数!") valid = False elif f % 2 != 0: print("脚的总数必须是偶数!") valid = False elif f < 2 * h or f > 4 * h: # 最少脚数:全是鸡(2*h);最多脚数:全是兔(4*h) print(f"脚的总数范围应在 {2*h}~{4*h} 之间!") valid = False if valid: # 除以2是因为兔子的两条腿已经算进去了 rabbit = (f - 2 * h) // 2 # 兔的数量 chicken = h - rabbit # 鸡的数量 # 最终验证(确保数量为非负整数) if rabbit >= 0 and chicken >= 0 and (2 * chicken + 4 * rabbit == f): print(f"鸡的数量:{chicken} 只") print(f"兔的数量:{rabbit} 只") else: print("无解:不存在满足条件的鸡和兔数量!")结果:
(5) 假如ls=[12, 45, 89, 92, 58, 98],求各整数元素的和。
代码:
ls = [12, 45, 89, 92, 58, 98] print("方法一") sum_total = 0 for i in range(0,len(ls)): sum_total += ls[i] print(sum_total) print("方法二") result = sum(ls) print(result)结果:
(6) 输入一个整数(1~12)表示月份,输出该月份对应的代表花名(用字典实现)。
月份对应的花名如下:
“1月”:“梅花”,“2月”:“杏花”,“3月”:“桃花”,“4月”:“牡丹花”,“5月”:“石榴花”,“6月”:“莲花”,“7月”:“玉簪花”,“8月”:“桂花”,“9月”:“菊花”,“10月”:“芙蓉花”,“11月”:“山茶花”,“12月”:“梅水仙花”
代码:
month_flower = { 1: "梅花", 2: "杏花", 3: "桃花", 4: "牡丹花", 5: "石榴花", 6: "莲花", 7: "玉簪花", 8: "桂花", 9: "菊花", 10: "芙蓉花", 11: "山茶花", 12: "梅水仙花" } month = int(input("请输入月份(1~12):")) if(1 <= month <= 12): flower = month_flower[month] print(flower) else: print("输入错误")结果:
(7) 有如下列表,li=[‘alex’, ‘eric’, ‘rain’],按要求实现每一个功能。
(a) 计算列表长度并输出。
(b) 列表中追加元素’seven’,并输出添加后的列表。
(c) 在列表的第一个位置插入元素“Tony”,并输出添加后的列表。
(d) 修改列表中第2个位置的元素为“Kelly”,并输出修改后的列表。
(e) 删除列表中的元素‘eric’,并输出删除后的列表。
(f) 删除列表中的第2个元素,并输出删除的元素的值和删除后的列表。
(g) 删除列表中的第2和3个元素,并输出删除元素后的列表。
(h) 将列表所有元素反转,并输出反转后的列表。
代码:
li = ['alex', 'eric', 'rain'] # (a)计算列表长度并输出 length = len(li) print("列表长度:", length) # (b)追加元素'seven',输出添加后的列表 li.append('seven') print(li) # 列表索引从0开始,第一个位置对应索引0 li.insert(0, 'Tony') print(li) li[1] = 'Kelly' print(li) # 使用remove()根据元素值删除(若有重复元素,只删第一个) li.remove('eric') print(li) # 第2个位置对应索引1,使用pop()根据索引删除(返回删除的元素) deleted_elem = li.pop(1) print("(f)删除的第2个元素:", deleted_elem) print("(f)删除后列表:", li) # del li[1:3] 表示删除索引1和2的元素(包含1,不包含3) del li[1:3] print("(g)删除第2和3个元素后:", li) # (b)追加元素'seven',输出添加后的列表 li.append('seven') # 方法1:使用reverse()(原地反转,无返回值) li.reverse() print("列表反转后(方法一):", li) # 方法2:使用切片li[::-1](生成新列表,原列表不变) # 这里将方法以反转的再反转回来了 new_li = li[::-1] print("列表反转后(方法二):", new_li)结果:
实验二
1. 实验目的
(1) 掌握Python中的算术运算符、关系运算符、逻辑运算符。
(2) 掌握if单分支结构、if…else双分支结构、if…elif多分支结构的用法。
(3) 掌握if语句嵌套用法。
(4) 掌握for循环、while循环的遍历用法。
(5) 掌握循环的嵌套用法。
2. 实验内容
(1) 空气质量问题一直是社会所关注的,一种简化的判别空气质量的模式如下:PM2.5数值0~35为优,35~75为良,75以上为污染。编写程序实现如下功能:输入PM2.5的值,输出当日的空气质量情况。
代码:
pm25 = float(input("请输入今日PM2.5数值:")) if 0 <= pm25 <= 35: quality = "优" elif 35 < pm25 <= 75: quality = "良" else: quality = "污染" print(f"今日PM2.5数值:{pm25:.1f}") print(f"当日空气质量情况:{quality}")结果:
(2) 编写程序,功能如下:判断输入的一个整数能否同时被2和3整除,若能,则输出“Yes”;否则输出“No”。
代码:
# 方法一 num = int(input("请输入一个整数:")) if num % 2 == 0 and num % 3 == 0: print("Yes") else: print("No") # 方法二 num1 = int(input("请输入一个整数:")) print("Yes" if num1 % 6 == 0 else "No")结果:
(3) 编写程序,实现分段函数的计算,分段函数如下:
代码:
x = float(input("请输入x:")) if x < 5: y = 0.0 elif 5 <= x < 10: y = 5 * x - 25 else: y = (x - 5) ** 2 print(y)结果:
(4) 编写程序,找出15个由1、2、3、4四个数字组成的各位不相同的三位数(如123、341、反例如442、333),要求用break控制个数。
代码:
count = 0 for baiwei in range(1, 5): for shiwei in range(1, 5): if shiwei == baiwei: continue for gewei in range(1, 5): if gewei == shiwei or gewei == baiwei: continue num = 100 * baiwei + 10 * shiwei + gewei print(num, end="\t") count += 1 if count == 15: break if count == 15: break if count == 15: break结果:
(5) 编写程序,删除列表中的重复元素。
# 方法一 li = [1, 2, 2, 3, 4, 4, 4, 5, 6, 6] # 通过转换为集合的方式去重 li1 = list(set(li)) print("方法一",li1) # 方法二(列表推导式) li = [1, 2, 2, 3, 4, 4, 4, 5, 6, 6] li2 = [] # 遍历原列表,只添加首次出现的元素 for num in li: if num not in li2: li2.append(num) print("方法二", li2)结果:
(6) 有一个数列,其前三项分别为1、2、3,从第四项开始,每项均为其相邻的前三项之和的1/2,问:该数列从第几项开始,其数值超过1200?
a1, a2, a3 = 1, 2, 3 n = 3 while True: n += 1 # 第四项 current = (a1 + a2 + a3) / 2 if current > 1200: break # 更新前三项:为下一次计算做准备(递推核心) a1, a2, a3 = a2, a3, current print(n)结果:
(7) 现有一个字典存放学生学号和成绩,成绩列表的三个数据分别是学生的语文、数学和英语成绩,编写程序,求每个学生的平均成绩。
学生成绩:s={‘Teddy’:[100,90,90], ‘Sandy’:[100,90,80], ‘Elmo’:[90,90,80]}
输出结果为:{‘Teddy’:93, ‘Sandy’:90, ‘Elmo’:86}
代码:
s = {'Teddy': [100, 90, 90], 'Sandy': [100, 90, 80], 'Elmo': [90, 90, 80]} # 初始化存储平均成绩的字典 avg_scores = {} # 遍历字典,计算每个学生的平均成绩 for name, scores in s.items(): avg = sum(scores) // len(scores) # len(scores)是科目数(3) # 给空字典avg_scores新增一个键值对: # 键:name(当前学生姓名,如'Teddy'); # 值:avg(当前学生的平均成绩,如93)。 avg_scores[name] = avg # 输出结果 print(avg_scores)结果:
实验三
1. 实验目的
(1) 掌握定义函数和调用函数的方法。
(2) 掌握函数实参与形参的对应关系,以及传递的方法。
(3) 理解函数的嵌套调用,局部变量和全局变量的区别。
(4) 学习在程序设计中运用函数解决实际问题,体会使用函数在提高代码可读性以及程序开发效率方面的重要性。
2. 实验内容
(1) 编写程序,输出所有两位数的素数(使用自定义函数实现)。
代码:
# 自定义函数:判断一个数是否为素数 def is_prime(n): """ 功能:判断整数n是否为素数 参数:n - 待判断的整数 返回值:True(是素数)/ False(不是素数) """ if n <= 1: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: # 若能被i整除,说明不是素数 return False return True # 遍历结束未找到因子,是素数 print("所有两位数的素数:") for num in range(10, 100): # 遍历10到99的所有整数 if is_prime(num): # 调用自定义函数判断 print(num, end=" ")结果:
所有两位数的素数:
(2) 输入两个非负整数m和n,编写函数计算组合数 (使用函数嵌套调用实现)。
代码:
def jiecheng(k): """计算k的阶乘(k≥0)""" if k == 0 or k == 1: return 1 # 0!和1!都等于1 result = 1 for i in range(2, k + 1): result *= i return result def zuhe(n, m): if m < 0 or n < 0 or m > n: return 0 fenzi = jiecheng(n) fenmu = jiecheng(m) * jiecheng(n - m) return fenzi // fenmu n = int(input("请输入非负整数n(总数):")) m = int(input("请输入非负整数m(选取数):")) c = zuhe(n, m) if c == 0 and not (0 <= m <= n): print(f"无法计算组合数C({n}, {m}):m不能大于n或为负数!") else: print(f"组合数C({n}, {m}) = {c}")结果:
(3) 编写函数,返回斐波那契数列的列表(利用递归函数实现)。
代码:
def fib(n): if n == 0: return 0 elif n == 1: return 1 else: return fib(n - 1) + fib(n - 2) # 测试示例 num = int(input("请输入要生成的斐波那契数列项数:")) for i in range(0,num): result = fib(i) print(result)结果:
(4) 编写函数,计算传入的字符串中数字和字母的个数并返回。
代码:
def geshu(s): # 数字个数 digits = sum(1 for c in s if c.isdigit()) # 字母个数 letters = sum(1 for c in s if c.isalpha()) return digits, letters s = "fjsadfskn26s121gdgdgdf" count = geshu(s) print("fjsadfskn26s121gdgdgdf中数字与字母的个数分别为:",count)结果:
(5) 编写一个将十进制转换成二进制的函数。
代码:
def shi_2_er(n): if n == 0: return "0b0" # 处理负数 is_fushu = False if n < 0: is_fushu = True n = abs(n) jieguo= [] # 除2取余,直到商为0 while n > 0: remainder = n % 2 jieguo.append(str(remainder)) n = n // 2 # 更新商为整除2的结果 # 余数列表反转(因为取余是从低位到高位) binary_str = "".join(reversed(jieguo)) # 用空字符串作为分隔符 # 添加符号和前缀 if is_fushu: return f"-0b{binary_str}" else: return f"0b{binary_str}" num = int(input("请输入一个十进制整数:")) result = shi_2_er(num) print(f"二进制结果:{result}") # 方法二 print(bin(num))结果:
实验四
1. 实验目的
(1) 掌握文件的打开(或建立)和关闭方法。
(2) 掌握文件的读写方法。
(3) 掌握文件和文件夹(目录)的操作方法。
2. 实验内容
(1) 编写实现文件读写操作,完成以下功能:
a. 随机生成100个100~500之间的整数,每10个整数占一行,写入test.txt文件。
b. 读取test.txt文件,显示每行数据并计算出每行最大值。
c. 统计偶数的个数并写入test.txt文件中。
import random def write_txt(): with open("test.txt", "w", encoding="utf-8") as f: numbers = [] for _ in range(100): num = random.randint(100, 500) numbers.append(str(num)) if len(numbers) == 10: f.write(" ".join(numbers) + "\n") numbers = [] def read_txt(): max_values = [] with open("test.txt", "r", encoding="utf-8") as f: print("文件的每行数据及每行数据的最大值") for line in f: line = line.strip() # 除去换行符和空格 if line: nums = list(map(int, line.split())) # 转换为整数列表 current_max = max(nums) max_values.append(current_max) print(f"{line} 最大值:{current_max}") return max_values def count(): count = 0 with open("test.txt", "r", encoding="utf-8") as f: for line in f: line = line.strip() if line: nums = list(map(int, line.split())) count += sum(1 for num in nums if num % 2 == 0) with open("test.txt", "a", encoding="utf-8") as f: f.write(f"\n偶数的总个数:{count}\n") print(f"\n统计完成,偶数总个数:{count}") if __name__ == "__main__": write_txt() read_txt() count()结果:
(2) 有一个文件temp.txt,分两行保存一周以来每天的最高最低温度,其中第一行为每天的最高温度,第二行为每天的最低温度。另外,编写程序计算一周以来最高最低温度,并计算全周的平均气温(每天平均温度的平均值)。
代码:
with open("temp.txt", "r", encoding="utf-8") as f: lines = f.readlines() # 按行读取文件 # strip()是移除首位的空白字符,split()将字符串按指定分隔符(空格)分割成列表 high_temps = list(map(int, lines[0].strip().split())) # 第一行数据 low_temps = list(map(int, lines[1].strip().split())) # 第二行数据 # 一周的最高温与最低温 week_high = max(high_temps) week_low = min(low_temps) print(f"一周最高温度:{week_high}℃") print(f"一周最低温度:{week_low}℃") # zip()将多个可迭代对象(如列表)按位置一一配对 # daliy_avg是一个数组 daliy_avg = [(high + low) / 2 for high, low in zip(high_temps,low_temps)] week_avg = sum(daliy_avg) / len(daliy_avg) print(f"全周平均气温:{week_avg:.2f}℃") # 保留2位小数temp.txt
32 30 28 31 29 33 30 20 18 19 22 21 23 20结果:
实验五
1 实验目的
(4) 理解面向对象的编程思想。
(5) 掌握类的定义方法和创建对象的方法。
(6) 理解并掌握继承的方法。
2 实验内容
(1)定义一个类Bank模拟ATM存取款,实现银行存取款功能。运行效果如下:
菜单
0:退出
1:存款
2:取款
请根据菜单输入操作编号:1
请输入存款金额:200
转入 200元 余额为 1200
代码:
class Bank: def __init__(self, initial_balance = 1000): """初始化账户余额,1000元""" self.balance = initial_balance def cunkuan(self, amount): """存款功能""" if amount > 0: self.balance += amount print(f"转入{amount}元,余额为:{self.balance}") else: print("存款金额必须大于0") def qukuan(self,amount): if amount > 0: if amount <= self.balance: self.balance -= amount print(f"取出{amount}元,余额为:{self.balance}") else: print("余额不足!!") else: print("取款金额必须大于0") def show_menu(self): """显示菜单""" print("菜单栏") print("0:退出") print("1:存款") print("2:取款") while True: choice = int(input("请根据菜单输入操作编号:")) if choice == 0: print("推出系统,感谢使用!") break elif choice == 1: amount = int(input("请输入存款金额")) self.cunkuan(amount) elif choice == 2: amount = int(input("请输入取款金额")) self.qukuan(amount) else: print("无效的操作符,请重新输入!") # 创建Bank实力并运行ATM系统 if __name__ == "__main__": atm = Bank() atm.show_menu()结果:
(2)文件data8-1.txt中保存了多个学生的成绩数据,如下所示:
学号,姓名,成绩
191001,吴娇,78
191002,张思思,89
201021,蔡弘羽,75
202022,甘雨婷,97
编写程序,定义一个类student表示学生,用类的实例对象表示每个学生的数据(学号、姓名、成绩),按成绩要求从高到低进行排序,输出结果。
代码:
class Student: def __init__(self, sid, name, score): self.sid = sid self.name = name self.score = score def __repr__(self): """自定义实例打印格式""" return f"{self.sid},{self.name},{self.score}" def read_student(file_path): """从文件读取学生数据""" students = [] with open(file_path, "r", encoding="utf-8") as f: next(f) # 跳过表头 for line in f: line = line.strip() if line: sid, name, score = line.split(",") students.append(Student(sid, name, int(score))) return students if __name__ == "__main__": student_list = read_student("data8-1.txt") # 要排序的可迭代对象student_list # 这里的key参数接收一个匿名函数(lambda),用于告诉sorted():按每个Student对象的score属性排序。 # reverse设置为True后,排序结果为降序(从大到小) sort_stu = sorted(student_list, key = lambda s: s.score, reverse=True) print(("学号,姓名,成绩")) for student in sort_stu: print(student)结果:
(3)定义一个Circle类,根据圆的半径求周长和面积,再由Circle类创建两个圆对象,其半径分别为5、10,要求输出各自的周长和面积。
代码:
import math class Circle: """圆类""" def __init__(self, banjing): self.banjing = banjing def zhouchang(self): """计算周长""" return 2 * math.pi * self.banjing def s(self): """计算面积""" return math.pi * (self.banjing ** 2) yuan1 = Circle(5) print(f"半径为{yuan1.banjing}的圆:") print(f"周长:{yuan1.zhouchang():.2f}") # 保留2位小数 print((f"面积:{yuan1.s():.2f}")) yuan2 = Circle(10) print(f"半径为{yuan2.banjing}的圆:") print(f"周长:{yuan2.zhouchang():.2f}") # 保留2位小数 print((f"面积:{yuan2.s():.2f}"))结果:
实验六
1 实验目的
(1) 熟悉使用Matplotlib库绘制基本图形。
(2) 掌握pyplot基本绘图流程。
(3) 掌握绘制多个子图的方法。
2 实验内容
(1)使用plot()函数绘制 ( )曲线。
代码:
import matplotlib matplotlib.use('TkAgg') # 使用TkAgg后端 import matplotlib.pyplot as plt import numpy as np # 生成连续1000个点 x = np.linspace(-8, 8, 1000) y = x**2 + 4*x + 3 plt.plot(x, y,'b-', linewidth=2, label='$y = x^2 + 4x + 3$') # 蓝色实线 plt.xlabel('x') plt.ylabel('y') plt.title('$y = x^2 + 4x + 3$') plt.legend() plt.show() # 显示图像结果:
(2)某项实验由两个小组同步在做,有5个指标[A, B, C, D, E],甲组完成的数据为[20, 34, 30, 35, 27],乙组完成的数据为[25, 32, 34, 20, 25]。编写程序,绘制条形图(柱形图)进行对比。
代码:
import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt import numpy as np # 解决中文显示问题 # 'font.sans-serif':配置 “无衬线字体” 的优先级列表 # ['SimHei']:将优先级最高的字体设置为 “黑体”(SimHei) plt.rcParams['font.sans-serif'] = ['SimHei'] # 'axes.unicode_minus':控制是否使用 Unicode 编码的负号(默认值为 True) # False:禁用 Unicode 负号,改用 ASCII 编码的负号(-) plt.rcParams['axes.unicode_minus'] = False indicators = ['A', 'B', 'C', 'D', 'E'] group_a = [20, 34, 30, 35, 27] group_b = [25, 32, 34, 20, 25] # 设置条形位置和宽度 # np.arange():NumPy 的连续整数生成函数 # 常用简化用法:np.arange(stop):生成从 0 到 stop-1 的连续整数(步长默认 1) x = np.arange(len(indicators)) width = 0.3 # 绘制条形图 # x - width/2:指定每个条形在 x 轴上的中心坐标,这是两组条形不重叠、并列显示 plt.bar(x - width/2, group_a, width, label='甲组', color='skyblue') plt.bar(x + width/2, group_b, width, label='乙组', color='lightcoral') # 基础标注 plt.title('甲乙两组实验指标对比') plt.xlabel('指标') plt.ylabel('数据') plt.xticks(x, indicators) plt.legend() # 显示图表 plt.show()结果:
(3)一个班的成绩为及格、中、良好、优秀的学生人数为20,33,44,26,据此编程绘制饼图,并设置图例。
代码:
import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt # 解决中文显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 数据准备 grades = ['及格', '中', '良好', '优秀'] # 成绩等级 counts = [20, 33, 44, 26] # 对应人数 colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99'] # 饼图颜色 # 绘制饼图 # counts:饼图的数值数据 # labels=grades → 扇区的标签 # colors=colors → 扇区的填充颜色 # autopct='%1.1f%%' → 扇区的百分比标注 # startangle=90 → 饼图的起始角度(第一个扇区从y轴正方向开始绘制) plt.pie(counts, labels=grades, colors=colors, autopct='%1.1f%%', startangle=90) # 添加图例 plt.legend(grades, title='成绩等级', loc='upper right') # 添加标题 plt.title('班级成绩等级分布饼图') # 保证饼图为正圆形 plt.axis('equal') # 显示图表 plt.show()结果: