Python课程实验-lab1
本文最后更新于235 天前,如有错误请发送邮件到yaoshengliy@gmail.com

实验 1 温度转换与输入输出强

知识点input()/print()、分支语句、字符串处理(教材 2.1-2.2)

实验任务

  1. 实现摄氏温度与华氏温度互转(保留两位小数)
  2. 扩展功能:输入错误处理(如非数字输入提示重新输入)
  3. 扩展:支持开尔文温度的三向转换

实验内容与结果

任务分析

摄氏温度与华氏温度互转有两条基本公式: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库则需要进行下载,使用用镜像源可以加快下载速度

实验任务

  1. 绘制嵌套彩色五角星(大小逐层递减)
  2. 设计函数绘制自定义正多边形(边数与颜色参数化)
  3. 扩展:实现动态旋转花瓣图案。

实验内容与结果

任务一:彩色五角星

任务一为绘制嵌套彩色五角星(大小逐层递减),并引入了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()

结果如下所示。

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

原文作者:© 风影 版权所有


原文链接:https://sily.showbyte.top/lab1/


本作品采用 CC BY-NC-ND 4.0 许可协议。禁止修改原文内容,引用时务必注明文章标题、原文链接及作者信息


暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇