20253312 实验二《Python程序设计》实验报告
学号 2025-2026-2 《Python程序设计》实验二报告
课程:《Python程序设计》
班级: 2533
姓名: 胡宸轩
学号: 20253312
实验教师:王志强
实验日期:2026年4月13日
必修/选修: 公选课
1.实验内容
(1)编写计算器程序
设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
考核基本语法、判定语句、循环语句、逻辑运算等知识点。
(2)用LLM生成一个计算器程序
介绍相关功能,并分析生成的程序代码含义。
对比分析自写程序与生成程序的区别(好与坏)。
2. 实验过程及结果
(1)编写计算器程序
设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。
考核基本语法、判定语句、循环语句、逻辑运算等知识点。
该计算器考虑了大部分计算,包括+,-,*,/,//,%,log,pow,&,|,^,~,sin,cos,tan,asin,acos,atan
引入必要math库

由于上述计算中存在的数的个数为2和1,因此考虑分开计算:

对于任意计算,采用调用函数进行运算

1对于两个数之间的计算,分别输入a,b两个数和运算符号进行计算,并通过while判断使计算符号输入合法:

通过判断运算符号,调用合适的运算函数,并格式化输出(由于&,|,^计算只能为整数,在运算前先进行判断)

2对于一个数之间的计算,分别输入x一个数和运算符号进行计算,并通过while判断使计算符号输入合法:

通过判断运算符号,调用合适的运算函数,并格式化输出

最后一部分考虑需不需继续进行计算,为防止非法输入自动再次循坏,添加判断使得输入合法,用lower()函数加以判断

综上,所有代码如下
import math
def add(a,b):
return a+b
def subtract(a,b):
return a-b
def multiply(a,b):
return a*b
def divide(a,b):
return a/b
def divide_exactly(a,b):
return a//b
def mod(a,b):
return a%b
def lg(a,b):
return math.log(a,b)
def power(a,b):
return math.pow(a,b)
def and_(a,b):
return a&b
def or_(a,b):
return a|b
def xor(a,b):
return a^b
def sin_(x):
return math.sin(x)
def cos_(x):
return math.cos(x)
def tan(x):
return math.tan(x)
def asin_(x):
return math.asin(x)
def atan_(x):
return math.atan(x)
def acos_(x):
return math.acos(x)
def not_(x):
return ~x
print("简单计算器 2026.4.13")
while True:
ops=input("请选择模式 1、两个数字计算 2、一个数字计算:")
if ops=="1":
a=eval(input("请输入第一个数: "))
b=eval(input("请输入第二个数: "))
op=input("请输入一个运算符[+,-,*,/,//,%,log,pow,&,|,^]: ")
c=["+","-","*","/","//","%","log","pow","&","|","^"]
while op not in c:
print("输入操作符有误,请重新输入!")
op=input("请输入一个运算符[+,-,*,/,//,%,log,pow,&,|,^]: ")
if op=="+":
print(f"{a} {op} {b} = {add(a,b)}")
elif op=="-":
print(f"{a} {op} {b} = {subtract(a,b)}")
elif op=="*":
print(f"{a} {op} {b} = {multiply(a,b)}")
elif op=="/":
print(f"{a} {op} {b} = {divide(a,b)}")
elif op=="%":
print(f"{a} {op} {b} = {mod(a,b)}")
elif op=="//":
print(f"{a} {op} {b} = {divide_exactly(a,b)}")
elif op=="pow":
print(f"{a} {op} {b} = {power(a,b)}")
elif op=="&":
if type(a)==int or type(b)==int:
print(f"{a} {op} {b} = {and_(int(a),int(b))}")
else:
print("请重新确认数据并重新输入")
elif op=="|":
if type(a) == int or type(b) == int:
print(f"{a} {op} {b} = {or_(int(a),int(b))}")
else:
print("请重新确认数据并重新输入")
elif op=="^":
if type(a) == int or type(b) == int:
print(f"{a} {op} {b} = {xor(int(a),int(b))}")
else:
print("请重新确认数据并重新输入")
elif ops=="2":
x=eval(input("请输入一个数: "))
y=input("请选择计算符号[sin,cos,tan,asin,acos,atan,~]: ")
c1=["sin","cos","tan","asin","acos","atan","!"]
while y not in c1:
print("输入操作符有误,请重新输入!")
y = input("请选择计算符号[sin,cos,tan,asin,acos,atan,~]: ")
if y=="sin":
print(f"{y} {x} = {sin_(x)}")
elif y=="cos":
print(f"{y} {x} = {cos_(x)}")
elif y=="tan":
print(f"{y} {x} = {tan(x)}")
elif y=="asin":
print(f"{y} {x} = {asin_(x)}")
elif y=="acos":
print(f"{y} {x} = {acos_(x)}")
elif y=="atan":
print(f"{y} {x} = {atan_(x)}")
elif y=="~":
print(f"{y} {x} = {not_(x)}")
con=input("是否继续?Y/n ")
while con not in ["Y","y","N","n"]:
con = input("是否继续?Y/n ")
if con.lower()=="n":
break
下面给出一些运行参考示例:

可以看出运行结果没有什么问题!
代码已提交到gitee仓库
gitee仓库
(2)用LLM生成一个计算器程序
介绍相关功能,并分析生成的程序代码含义。
对比分析自写程序与生成程序的区别(好与坏)。
让元宝的deepseek模型生成一个计算器
给出提示词“写一个python写的计算器,要求简单复杂又刺激”
生成代码如下:
import math
import random
import time
import sys
import os
from datetime import datetime
class 刺激计算器:
def __init__(self):
self.历史记录 = []
self.彩蛋激活 = False
self.疯狂模式 = False
self.音效 = True
self.显示欢迎信息()
def 显示欢迎信息(self):
print("\n" + "=" * 50)
print("🔥 刺激计算器 v2.0 🔥")
print("=" * 50)
print("特点:")
print(" • 极简: 直接输入表达式")
print(" • 复杂: 支持高级数学函数")
print(" . 刺激: 隐藏功能等待发现!")
print("输入 'help' 查看帮助, 'exit' 退出")
print("提示: 试试输入 '惊喜' 或 '彩蛋'")
print("=" * 50)
def 显示帮助(self):
print("\n📖 帮助菜单:")
print(" 基本运算: +, -, *, /, %, **, //")
print(" 高级函数: sin, cos, tan, log, sqrt, pi, e")
print(" 特殊命令:")
print(" help - 显示此帮助")
print(" hist - 查看历史记录")
print(" clear - 清屏")
print(" time - 当前时间")
print(" game - 数学游戏")
print(" crazy - 疯狂模式(谨慎使用!)")
print(" exit - 退出计算器")
print(" 彩蛋命令: 惊喜, 彩蛋, 刺激, 秘密")
print("\n示例: 2*pi, sin(45), 2**10, 3+4 * 5")
def 数学游戏(self):
print("\n🎮 数学挑战模式 🎮")
print("回答5个问题,测试你的数学能力!")
分数 = 0
操作列表 = ['+', '-', '*', '**']
for i in range(1, 6):
a = random.randint(1, 20)
b = random.randint(1, 10)
操作 = random.choice(操作列表)
if 操作 == '**':
b = random.randint(2, 3)
问题 = f"{a} {操作} {b}"
答案 = a ** b
else:
问题 = f"{a} {操作} {b}"
答案 = eval(f"{a}{操作}{b}")
print(f"\n第{i}题: {问题} = ?")
try:
用户答案 = float(input("你的答案: "))
if abs(用户答案 - 答案) < 0.001:
print("✅ 正确!")
分数 += 1
else:
print(f"❌ 错误! 正确答案是: {答案}")
except:
print(f"❌ 输入无效! 正确答案是: {答案}")
time.sleep(0.5)
print(f"\n🏁 游戏结束! 你的分数: {分数}/5")
if 分数 == 5:
print("🎉 天才! 你是数学大师!")
elif 分数 >= 3:
print("👍 不错! 继续努力!")
else:
print("💪 加油练习!")
def 疯狂模式切换(self):
self.疯狂模式 = not self.疯狂模式
状态 = "激活" if self.疯狂模式 else "关闭"
print(f"\n{'⚡' * 20}")
print(f"⚡ 疯狂模式 {状态}! ⚡")
print(f"{'⚡' * 20}")
if self.疯狂模式:
print("警告: 所有计算将带有随机性!")
print("提示: 尝试在表达式中使用 '?'")
def 处理彩蛋(self, 命令):
彩蛋列表 = {
"惊喜": "🎁 恭喜发现彩蛋! 试试: 2?3 或 sin(?)",
"彩蛋": "🥚 隐藏功能已激活! 输入 '秘密' 查看更多",
"刺激": "🎢 准备好刺激了吗? 输入 'crazy'!",
"秘密": f"🔐 秘密代码: {random.randint(1000, 9999)}",
"答案": "42", # 生命、宇宙和一切的答案
"你好": "👋 你好! 我是刺激计算器!",
}
if 命令 in 彩蛋列表:
print(f"\n{彩蛋列表[命令]}")
self.彩蛋激活 = True
return True
return False
def 处理表达式(self, 表达式):
# 移除空格
表达式 = 表达式.replace(" ", "")
# 检查彩蛋命令
if self.处理彩蛋(表达式.lower()):
return None
# 疯狂模式处理
if self.疯狂模式 and "?" in 表达式:
表达式 = 表达式.replace("?", str(random.randint(1, 10)))
print(f"疯狂替换: {表达式}")
# 安全评估函数
def 安全评估(expr):
# 允许的数学函数和常量
allowed_names = {
'abs': abs, 'round': round,
'sin': math.sin, 'cos': math.cos, 'tan': math.tan,
'asin': math.asin, 'acos': math.acos, 'atan': math.atan,
'log': math.log, 'log10': math.log10,
'sqrt': math.sqrt, 'exp': math.exp,
'pi': math.pi, 'e': math.e,
'radians': math.radians, 'degrees': math.degrees,
}
# 编译表达式
code = compile(expr, "<string>", "eval")
# 检查允许的名称
for name in code.co_names:
if name not in allowed_names:
raise NameError(f"禁止使用函数/变量: {name}")
# 使用安全的环境执行
return eval(code, {"__builtins__": {}}, allowed_names)
try:
# 处理特殊命令
if 表达式 == "help":
self.显示帮助()
return None
elif 表达式 == "hist":
self.显示历史()
return None
elif 表达式 == "clear":
os.system('cls' if os.name == 'nt' else 'clear')
return None
elif 表达式 == "time":
print(f"⏰ 当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
return None
elif 表达式 == "game":
self.数学游戏()
return None
elif 表达式 == "crazy":
self.疯狂模式切换()
return None
elif 表达式.lower() == "exit":
print("\n再见! 欢迎再次使用刺激计算器!")
sys.exit(0)
# 处理数学表达式
结果 = 安全评估(表达式)
# 记录历史
self.历史记录.append(f"{表达式} = {结果}")
# 保留最近10条历史
if len(self.历史记录) > 10:
self.历史记录.pop(0)
return 结果
except ZeroDivisionError:
return "错误: 除以零!"
except (NameError, SyntaxError) as e:
return f"错误: 表达式无效 - {e}"
except Exception as e:
return f"错误: {type(e).__name__} - {e}"
def 显示历史(self):
if not self.历史记录:
print("📜 历史记录为空")
else:
print("\n📜 计算历史:")
for i, 记录 in enumerate(self.历史记录, 1):
print(f" {i:2}. {记录}")
def 运行(self):
while True:
try:
# 获取用户输入
if self.疯狂模式:
输入 = input(f"\n⚡ [{random.choice(['?', '!', '*', '#', '$'])}] >> ")
else:
输入 = input("\n>> ")
if not 输入.strip():
continue
# 处理输入
结果 = self.处理表达式(输入)
# 显示结果
if 结果 is not None:
# 添加一些"刺激"的随机效果
if self.疯狂模式 and random.random() > 0.7:
装饰 = random.choice(['💥', '⚡', '🎯', '🔥', '✨'])
print(f"{装饰} 结果: {结果} {装饰}")
else:
print(f"结果: {结果}")
except KeyboardInterrupt:
print("\n\n检测到中断,输入 'exit' 退出")
except EOFError:
print("\n\n再见!")
break
except Exception as e:
print(f"意外错误: {e}")
def main():
# 创建计算器实例
计算器 = 刺激计算器()
# 运行计算器
计算器.运行()
if __name__ == "__main__":
main()
下面是一些运行的参考示例:

详细分析由元宝生成的代码
首先创建一个类(刺激计算机),并创建多个函数用来分别实现不同的功能。
显示欢迎信息和显示帮助函数仅同过print输出内容帮助。
数学游戏函数通过随机生成数字由用户猜测运算符号并计分,实现小游戏的功能。
设置疯狂模式切换和处理彩蛋增加了计算器的刺激性和趣味性。
在处理表达式模块增加安全评估,判断输入的函数是否符合规范,对于表达式采用直接计算的方法,使用try except处理异常和不合规表达式,并保留最多10条历史记录。
在运行模块也采用try except处理异常情况,并根据是否疯狂模式分别处理输入结果
对比分析自写程序与生成程序的区别(好与坏):
相同点:都支持基本四则运算和高级函数(如sin,cos等)
自写程序的好处:支持部分位运算操作 坏处:只支持一个数字和两个数字的计算
生成程序的好处:支持表达式计算,有内置的常量(如pi,e等),有历史记录,有游戏和彩蛋(增加刺激性和趣味性)
3. 实验过程中遇到的问题和解决过程
- 问题1:&,|,^只支持整数间的运算,输入为float和complex类型时会产生错误
- 问题1解决方案:在进行位运算之前先用type判断a,b类型是否为int,为int则进行计算,否则输出错误信息
其他(感悟、思考等)
这次编写计算器代码的实验比较基础,充分运用了以前所学的知识,能够有效理解流程和有关于def自定义函数的相关操作。
但是,本次手写的计算器具有非常大的局限性,只能计算有限个数间的运算,且不能添加括号等其他内容,距离真实的计算器还有很大的差距。
使用def自定义函数增加了代码的可扩展性,后续还可以添加其他更多样的计算功能。
注意函数(如sin()函数引入操作的两种方法,
1.import math
math.sin()
2.from math import sin
sin()
浙公网安备 33010602011771号