实验 1 温度转换与输入输出强化
知识点:input()/print()、分支语句、字符串处理(教材 2.1-2.2)
实验任务
- 实现摄氏温度与华氏温度互转(保留两位小数)
- 扩展功能:输入错误处理(如非数字输入提示重新输入)
- 扩展:支持开尔文温度的三向转换
实验内容与结果
任务分析
摄氏温度与华氏温度互转有两条基本公式:C = (F – 32)/1.8、F = C * 1.8 + 32,只要识别用户输入数据是摄氏温度还是华氏温度即可进行相互转换。
输入错误处理,如非数字输入提示重新输入,添加条件判断。
支持开尔文温度的三项转换,需要知道基本公式:K = C + 273.15,然后根据摄氏温度与华氏温度的相互转换公式即可得到三项转换:C = K – 273.15,F = C * 1.8 + 32
代码与结果分析
在最开始,我仿照书本上的源码进行改编,然后按照上述分析添加了两个扩展功能,代码如下:
# TempConvert.py
# 转换算法:C = (F - 32)/1.8、F = C * 1.8 + 32、K = C + 273.15
def TempConvert(Temp):
if Temp[-1] in ['F', 'f']:
C = (eval(Temp[:-1]) - 32)/1.8
print(f"转换后的结果为:{C:.2f}°C")
elif Temp[-1] in ['C', 'c']:
F = eval(Temp[:-1]) * 1.8 + 32
print(f"转换后的结果为:{F:.2f}°F")
# 拓展:支持开尔文温度的三向转换
elif Temp[-1] in ['K', 'k']:
C = eval(Temp[:-1]) - 273.15
F = C * 1.8 + 32
print(f"转换后的结果为:C={C:.2f}°C、F={F:.2f}°F")
Temp = input("输入带有符号的温度值:")
while True:
# 拓展:输入错误处理(如非数字输入提示重新输入)
if Temp[-1] in ['F', 'f', 'C', 'c', 'K', 'k']:
TempConvert(Temp)
break
else:
print("输入错误,请重新输入:")
Temp = input("输入带有符号的温度值:")
continue
由上述代码,通过切片来判断输入的合法性以及进行转换,对于输入错误处理,我建立了一个死循环,并也以切片判断合法性,经过测试后,存在的问题是当我输入类似”wwwF”、“中文K”,这些非法数据会报错,如下所示。

这是因为我仅仅只对输入字符的最后一位进行判断,并没有考虑到数字位是否合法。
经过上述分析,我将对代码进行优化,引入try-except结构对输入错误的数据进行判断并引导重新输入,为了一次性测试多组数据,只有当用户输入”exit”时才退出程序,下述是优化代码。
def temp_convert(temp_str):
try:
unit = temp_str[-1].upper()
value = float(temp_str[:-1])
except (ValueError, IndexError):
return "格式错误,请输入正确格式,例如 32F、0C、273.15K"
if unit == 'F':
c = (value - 32) / 1.8
return f"转换后的结果为:{c:.2f}°C"
elif unit == 'C':
f = value * 1.8 + 32
return f"转换后的结果为:{f:.2f}°F"
elif unit == 'K':
c = value - 273.15
f = c * 1.8 + 32
return f"转换后的结果为:C={c:.2f}°C、F={f:.2f}°F"
else:
return "无法识别的温度单位,请以 C、F 或 K 结尾"
print("欢迎使用温度转换器(输入 exit 退出)")
while True:
temp_input = input("请输入带有单位的温度值(如 36.6C、100F、300K):")
if temp_input.strip().lower() == "exit":
print("已退出程序。")
break
result = temp_convert(temp_input)
print(result)
此时程序能够正常运行,运行结果如下所示。

实验 2 turtle 库绘制进阶图形
知识点:turtle库坐标控制、循环结构、函数封装(教材 2.3-2.4)
注意:若环境中无法引入
turtle库则需要进行下载,使用用镜像源可以加快下载速度
实验任务
- 绘制嵌套彩色五角星(大小逐层递减)
- 设计函数绘制自定义正多边形(边数与颜色参数化)
- 扩展:实现动态旋转花瓣图案。
实验内容与结果
任务一:彩色五角星
任务一为绘制嵌套彩色五角星(大小逐层递减),并引入了turtle 库进行绘制图形。为了实现彩色的效果,引入了colorsys颜色系统,对于大小逐层递减,则通过循环调用函数,来绘制多个大小不同的五角星,并使用HSV到RGB的颜色转换。代码实现如下。
# DrawPython.py
import turtle as t
import colorsys
# 绘制嵌套彩色五角星(大小逐层递减)
# 设置画布
t.bgcolor("white")
t.speed(0) # 设置绘图速度为最快
# 绘制五角星的函数
def draw_star(size, color):
t.color(color)
t.begin_fill()
for _ in range(5):
t.forward(size)
t.right(144)
t.end_fill()
# 嵌套五角星数量
n = 10
hue = 0
# 初始大小
size = 200
for i in range(n):
t.penup()
t.goto(0, -size / 2) # 保持中心一致
t.pendown()
# HSV颜色转RGB,生成渐变颜色
color = colorsys.hsv_to_rgb(hue, 1, 1)
draw_star(size, color)
# 减小大小
size *= 0.8
hue += 1 / n # 颜色变换
# 结束绘图
t.hideturtle()
t.done()
运行的结果如下所示。

由图中可以看出,嵌套五角星大小向上逐级递减,且颜色不一。
任务二:自定义正多边形
任务二需要设计函数绘制自定义正多边形(边数与颜色参数化),我通过编写函数draw_polygon(sides, length, color),通过参数传入边数、边长和颜色,使用 turtle 循环绘制,并通过角度计算确保图形闭合,在进行绘制前需要保证输入的边数合法,代码如下所示,提供了两个测试数据。
# 设计函数绘制自定义正多边形(边数与颜色参数化)
import turtle as t
def draw_polygon(sides, length, color='blue'):
"""
绘制正多边形
:param sides: 边数(整数,>=3)
:param length: 每条边的长度
:param color: 颜色(可以是字符串,如'red',也可以是RGB元组)
"""
if sides < 3:
raise ValueError("正多边形至少需要3条边")
angle = 360 / sides
t.color(color)
t.begin_fill()
for _ in range(sides):
t.forward(length)
t.right(angle)
t.end_fill()
# 示例用法
t.bgcolor("white")
t.speed(0)
t.penup()
t.goto(-100, 0)
t.pendown()
# 绘制红色五边形
draw_polygon(5, 100, 'red')
t.penup()
t.goto(100, 0)
t.pendown()
# 绘制绿色八边形
draw_polygon(8, 60, 'green')
t.hideturtle()
t.done()
结果如下所示。

函数传入的参数包含边数、长度、颜色,从结果图可以看出成功实现功能。
任务三:实现动态旋转花瓣图案
任务三为扩展,需要实现动态旋转花瓣图案。通过使用 Python 的 turtle 库绘制并动态旋转一个五瓣花图案。首先定义 draw_petal 函数绘制单个花瓣(通过两段对称的圆弧组成),draw_flower 函数通过旋转角度将多个花瓣排布成花型。主函数 animate_flower 每隔 50 毫秒清除画布并以递增角度重绘花朵,实现花朵不断旋转的动画效果。通过 screen.tracer(0) 与 screen.update() 提高绘图效率,实现平滑动态效果。代码如下。
import turtle
import math
# 设置窗口
screen = turtle.Screen()
screen.bgcolor("white")
screen.title("动态旋转花瓣图案")
screen.tracer(0) # 关闭自动更新以提升动画性能
# 创建花瓣绘图对象
petal = turtle.Turtle()
petal.hideturtle()
petal.speed(0)
petal.color("red", "darkred")
def draw_petal(t, radius, angle):
t.begin_fill()
t.circle(radius, angle)
t.left(180 - angle)
t.circle(radius, angle)
t.left(180 - angle)
t.end_fill()
def draw_flower(t, petal_count, radius, angle):
for _ in range(petal_count):
draw_petal(t, radius, angle)
t.left(360 / petal_count)
# 动态旋转函数
def animate_flower():
petal.clear()
petal.penup()
petal.goto(0, 0)
petal.pendown()
petal.setheading(animate_flower.angle)
draw_flower(petal, 5, 60, 60) # 五瓣花,花瓣弧度为60度
animate_flower.angle += 2
screen.update()
screen.ontimer(animate_flower, 50)
animate_flower.angle = 0
animate_flower()
screen.mainloop()
结果如下所示。

运行结果是动态红色花瓣进行旋转,实现目标功能。






