实验二Python控制结构与文件操作
一、实验基本原理
运用Anaconda搭建的Jupyternotebook平台编写Python实例程序。
二、实验目的
1、理解Python的流程控制、文件操作的基本原理。
2、通过实际案例编程,掌握Python的流程控制、文件的基本操作。
三、具体要求
1、Python的流程控制:顺序结构、选择结构、循环结构。
2、Python流程语句:if语句、for语句、while语句、break、continue等。
3、if、for、while等语句相互之间的嵌套程序开发等。
4、Python的文件操作、异常处理。
四、实验环境
1、Windows10电脑一台。
2、Anaconda、Python、Jupyternotebook平台。
五、实验内容
实例1:计算三角形面积。
用Python编程实现,接收用户从键盘输入的三角形的三边长,判断任意两边之和能否大于第三边,如果大于,则计算三角形的面积(先计算半周长,同实验一),并输出,否则显示“你所输入的三边长不能构成三角形”。运行程序一次,可以计算多个三角形的面积。
要求:
(1)计算三角形面积,在一个自定义函数fun(a,b,c)中完成,该函数名可以改成其它名字。该函数返回面积值。
(2)主调程序中完成功能:三边长数值的输入(不能是负数)、判断能否构成三角形和面积值的输出。
(3)形参a、b、c接收主调程序传递过来的实参:三边的值,要求使用关键字参数传递。
#实例 1:计算三角形面积 import math # 定义计算三角形面积的函数 def fun(a, b, c): # 计算半周长 p = (a + b + c) / 2 # 计算面积(海伦公式) area = math.sqrt(p * (p - a) * (p - b) * (p - c)) return area # 主程序 def main(): # 输入三边长,并进行有效性检查 while True: try: a = float(input("请输入第一边的长度:")) b = float(input("请输入第二边的长度:")) c = float(input("请输入第三边的长度:")) # 判断是否为负数或零 if a <= 0 or b <= 0 or c <= 0: print("边长必须是正数,请重新输入!") continue # 如果输入无效,继续要求输入 else: break # 三边有效,跳出循环 except ValueError: print("输入无效,请输入数字!") # 判断是否能构成三角形并计算面积 if a + b > c and a + c > b and b + c > a: # 三角形不等式 area = fun(a, b, c) print(f"三角形的面积是:{area:.2f}") else: print("无法构成三角形") # 调用主程序 main()实例2:随机点名。
线上上课时,随机点名。以班级人数n为上限,随机生成m个整数(大于0小于班级人数+1)作为学号,要求这m个学生在30秒内在QQ群或腾讯课堂讨论区,回复1,过30秒后未回复1按旷课处理。提示:本题只需产生m个互不相同的随机整数并输出,即可。
#实例 2:随机点名 import random # 主程序 def main(): # 输入班级人数和需要点名的人数 n = int(input("请输入班级人数:")) m = int(input("请输入点名人数:")) # 判断输入是否合法 if m > n: print("点名人数不能大于班级人数!") return # 生成随机学生编号 students = random.sample(range(1, n + 1), m) # 输出随机生成的学生编号 print("随机点名结果:") print(" ".join(map(str, students))) # 调用主程序 main()实例3:奖金发放。
某企业发放的奖金是根据员工给企业创造的利润提成计算的,其规则如下所示。利润
(1)低于或等于10万元时,奖金可提10%;
(2)利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;以下皆按照阶梯计算提成。
(3)低于20万元时如上,20万到40万之间时,高于20万元的部分,可提成5%;
(4)低于40万元时如上,40万到60万之间时高于40万元的部分,可提成3%;
(5)低于60万元时如上,60万到100万之间时,高于60万元的部分,可提成1.5%;
(6)低于100万元时如上,高于100万元时,超过100万元的部分按1%提成。
要求:从键盘输入某员工为企业创造的利润值,输入他应获得的奖金。交实验报告时,要求输入为123万的输出结果。
#实例 3:奖金发放 def calculate_bonus(profit): if profit <= 10: # 利润≤10万,提10% return profit * 0.1 elif profit <= 20: # 10万<利润≤20万:前10万提10%,超出部分提7.5% return 10 * 0.1 + (profit - 10) * 0.075 elif profit <= 40: # 20万<利润≤40万:前10万10% + 中间10万7.5% + 超出20万部分5% return 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05 elif profit <= 60: # 40万<利润≤60万:前40万按上式 + 超出40万部分3% return 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03 elif profit <= 100: # 60万<利润≤100万:前60万按上式 + 超出60万部分1.5% return 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015 else: # 利润>100万:前100万按上式 + 超出100万部分1% return 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01 def main(): profit = float(input("请输入利润(万元):")) bonus = calculate_bonus(profit) print(f"应得奖金为:{bonus:.2f} 万元") main()实例4:逢七拍手游戏。
要求按水平方向(行)顺序输出100以内的所有数字,含7或能被7整除的数,显示“*”,表示拍手。输出例如:
#实例 4:逢七拍手游戏 # 打印 1 到 100 之间的所有数字 def game(): for i in range(1, 101): # 判断数字是否包含7或能被7整除 if '7' in str(i) or i % 7 == 0: print('*', end=' ') else: print(i, end=' ') # 调用函数开始游戏 game()实例5:猜数字大小游戏。
猜数游戏是一个益智类小游戏,通常由两人参与,一个人(你所编写的程序)出数字,另一个人(玩家:就是你)猜数字,当猜数字的人说出一个数字时,由出数字的人告知是否猜中,知道猜中,游戏结束。
import random # 定义猜数字游戏 def guess_game(): # 生成目标数字(1 到 100 之间) target = random.randint(1, 100) # 游戏提示 print("欢迎来到猜数字游戏!") print("游戏开始,猜一个1到100之间的数字。") # 初始化猜测次数 attempts = 0 max_attempts = 5 # 最多猜 5 次 # 游戏主循环 while attempts < max_attempts: # 获取玩家的猜测 guess = int(input(f"请输入一个数字:")) # 增加猜测次数 attempts += 1 # 判断猜测结果 if guess < target: print("您输入的数字小了!") elif guess > target: print("您输入的数字大了!") else: print(f"恭喜,您猜对了!答案是 {target}。") print(f"游戏结束!您总共猜了 {attempts} 次。") break # 猜对了,结束游戏 else: # 超过 5 次后游戏结束 print(f"很遗憾,5次机会已用尽,游戏结束,答案为 {target}。") # 调用游戏函数 guess_game()实例6:将学生名单存入Excel文件中。
将模块student_XYY.py(见附件)中的字典dict_stu中的学生名单存入Excel文档“student_XYY.xlsx”中。student_XYY.py内容如下(以1班的1号为例):
dict_stu={1:'程小青',3:'石雯雯',4:'苏彤',5:'王欣雨',6:'薄智鑫',7:'陈华超',8:'葛超驰',9:'韩硕',11:'黄昊',12:'焦俊',13:'黎子豪',14:'李博文',15:'李荣伟',16:'李帅奇',18:'李炜',19:'李月仓',20:'刘高伟',21:'路迪飞',22:'宋禹宏',24:'田朕宇',25:'王禹皓',26:'吴琪琛',27:'吴永帅',28:'颜亨太',30:'张珈玮',31:'张家朋',34:'张子傲',35:'赵瑞',36:'赵永旺',37:'赵振',38:'朱苏宁',39:'朱唐喜',40:'庄廷泽',41:'邹超磊'}
存入Excel文档“student_101.xlsx”后,格式如下:
提示:
fromstudent_101import*#导入student_101.py文件。使用openpyxl创建workbook。
fromopenpyxlimportWorkbook
Workbook()#创建工作簿
wb.create_sheet(title="student")#创建工作表
#实例 6:将学生名单存入 Excel 文件中 from openpyxl import Workbook # 创建一个字典,包含学生的编号和姓名 dict_stu = { 1: '程小青', 3: '石雯雯', 4: '苏彤', 5: '王欣雨', 6: '薄智鑫', 7: '陈华超', 8: '葛超驰', 9: '韩硕', 11: '黄昊', 12: '焦俊', 13: '黎子豪', 14: '李博文', 15: '李荣伟', 16: '李帅奇', 18: '李炜', 19: '李月仓', 20: '刘高伟', 21: '路迪飞', 22: '宋禹宏', 24: '田朕宇', 25: '王禹皓', 26: '吴琪琛', 27: '吴永帅', 28: '颜亨太', 30: '张珈玮', 31: '张家朋', 34: '张子傲', 35: '赵瑞', 36: '赵永旺', 37: '赵振', 38: '朱苏宁', 39: '朱唐喜', 40: '庄廷泽', 41: '邹超磊' } # 创建Excel工作簿 wb = Workbook() # 创建工作表并命名 ws = wb.active ws.title = "学生名单" # 添加表头 ws.append(["学号", "姓名"]) # 将字典中的数据写入Excel for student_id, student_name in dict_stu.items(): ws.append([student_id, student_name]) # 保存文件到指定路径 file_path = r"E:\人工智能与大数据\实验\student_553.xlsx" wb.save(file_path) print(f"数据已成功保存到: {file_path}")六:思考题
思考题1:随机点名。
要求:对上题生成的学生学号及姓名数据集文件“student_XYY.xlsx”中的学生进行随机抽取点名,抽取到的同学的学号和姓名显示输出,提示被点到名字的同学在QQ群回复1。然后开始正向计时30秒(用sleep()函数完成),以进度条的形式显示。计时结束后显示点名结束。进度条等自己设计,合理即可。
提示:
(1)导入文件内容
fromopenpyxlimportload_workbook
load_workbook(“student_101.xlsx”)#打开已有的excel文件
(2)随机抽取点名人数和列表
fromrandomimport*
fromtimeimport*
fromsysimport*
输出格式例如:
(3)倒计时显示例如:
#思考题 1:随机点名 import random import time from openpyxl import load_workbook import sys # 导入Excel文件 file_path = r"E:\人工智能与大数据\实验\student_553.xlsx" wb = load_workbook(file_path) ws = wb.active # 获取学生名单和学号 students = [] for row in ws.iter_rows(min_row=2, max_row=42, min_col=1, max_col=2): students.append((row[0].value, row[1].value)) # 存储学号和姓名的元组 # 输入点名人数 num_to_call = int(input("请输入需要点名的人数(不大于34,不小于1):")) # 确保输入的点名人数不超过学生总数 if num_to_call > len(students): print("点名人数不能超过学生总数!") else: # 打印提示信息 print("点名人数为:", num_to_call) # 随机抽取并显示学生 selected_students = random.sample(students, num_to_call) # 随机抽取指定人数的学生 print(f"抽取的 {num_to_call} 名学生:") for student in selected_students: student_id, student_name = student print(f"学号:{student_id} 姓名:{student_name}") print(f"请上面 {num_to_call} 个同学30秒钟之内在QQ群回复1!") print('-' * 15 + "计时开始" + '-' * 15) # 显示倒计时进度条 for i in range(30, 0, -1): time.sleep(1) sys.stdout.write(f"\r[{'#' * (30 - i)}{' ' * i}] {i}s") sys.stdout.flush() print("\n" + '-' * 15 + "计时结束" + '-' * 15) print("游戏结束!")思考题2:唐诗宋词。
将一首唐诗宋词字符串写入文本文件(扩展名为.txt),以古诗为例:诗名为第一行,古诗作者为第二行,第三行及以后一行一句诗句;要求每行内容居中。然后再从文件整体读取出来并输出;最后再输出诗的第一句诗。
要求:
(1)文本文件的主文件名用自己的学号和名字,假如1号张三,则文件名为:01-张三-思考题2.txt。
(2)写入上述文件中的字符串要求是一首古诗词,每个同学写入的诗词都不能一样,否则算作雷同,0分记。
(3)使用异常捕获与处理。
(4)使用with语句打开和自动关闭打开的文件。
(5)写入和读出分两段程序完成,并且读出使用三种方法完成。read()函数、readlines()函数及for循环。
import os # 定义数据 poem_title = "鹿柴" # 诗名 poet = "王维" # 诗人 poem_lines = [ "空山不见人,", "但闻人语响。", "返景入深林,", "复照青苔上。" ] # 生成居中的诗句(获取最长行长度,用于居中对齐) max_length = max(len(poem_title), len(poet), max(len(line) for line in poem_lines)) # 指定文件存放目录 file_directory = r"E:\人工智能与大数据\实验" file_name = "53-吴涛-思考题2.txt" file_path = os.path.join(file_directory, file_name) # 合并路径和文件名 # 确保目录存在 if not os.path.exists(file_directory): os.makedirs(file_directory) # 将诗歌写入文件 print(f"正在写入文件:{file_path} ...") with open(file_path, "w", encoding="utf-8") as f: # 写入诗名,居中 f.write(poem_title.center(max_length) + '\n') # 写入诗人名,居中 f.write(poet.center(max_length) + '\n') # 写入每一行诗句,居中 for line in poem_lines: f.write(line.center(max_length) + '\n') print("写入完成!\n") # 读取文件内容 # 方法一:使用 read() 函数(一次性读取全部) print(" 读取方法一:read() " ) with open(file_path, "r", encoding="utf-8") as f: content = f.read() print(content) # 方法二:使用 readlines() 函数(读取为列表) print(" 读取方法二:readlines() ") with open(file_path, "r", encoding="utf-8") as f: lines = f.readlines() for line in lines: # line中已经包含换行符,所以print时设置end=''避免双重换行 print(line, end='') # 方法三:使用 for 循环遍历文件对象(节省内存,逐行读取) print("\n" " 读取方法三:for 循环 ") with open(file_path, "r", encoding="utf-8") as f: for line in f: print(line, end='') print() # 打印一个空行 # 输出诗的第一句 print("诗的第一句:") print(poem_lines[0]) # 输出第一句诗