You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何精简Python turtle绘图代码 使用未涉及的新写法优化

Python turtle绘图代码精简方案

原代码冗余点梳理

  • 重复导入:同时写from turtle import *和import turtle as t属于重复导入,保留一种引用方式即可
  • 无效传参:draw()函数定义接收line参数,但函数内部完全没有使用该参数
  • 重复计算:斜向移动步长sqrt(edge**2*2)/2每次调用draw()都会重复计算,实际只需要算1次存为常量即可
  • 全局变量滥用:linenum、lineeve以及输入的边长、次数参数全部设为全局变量,容易出现状态混乱,可通过函数入参传递
  • 逻辑拆分冗余:奇数行、偶数行绘制逻辑拆成两个独立大函数,存在大量重复的抬笔、转向、移动代码,可以合并公共逻辑

用到的精简新写法

  • 常量预计算:把所有重复用到的固定步长提前计算赋值,减少运行时重复运算
  • 循环计数统一:奇偶行的绘制数量规律可以在循环里统一处理,不需要拆分两个独立的行绘制函数
  • 状态集中控制:偶数行需要旋转绘制的要求,只需要在整行绘制前统一调整海龟角度即可,不需要每绘制一个基础图形就旋转一次
  • 消除全局状态:所有参数通过函数入参传递,逻辑链路更清晰,也方便后续修改参数

精简后可直接运行的代码

from turtle import *
from math import sqrt

def draw(edge, diag_half):
    # 绘制第一个填充块
    begin_fill()
    rt(45)
    fd(diag_half)
    rt(90)
    fd(diag_half)
    rt(135)
    fd(edge)
    rt(90)
    end_fill()
    fd(edge)
    rt(180)
    # 绘制第二个填充块
    begin_fill()
    lt(45)
    fd(diag_half)
    lt(90)
    fd(diag_half)
    rt(135)
    end_fill()
    fd(edge)

if __name__ == "__main__":
    edge = int(input("请输入正方形边长:"))
    total_line = int(input("请输入重复绘制次数:"))
    color("blue")
    speed(0)
    diag_half = edge * sqrt(2) / 2
    diag_full = diag_half * 2
    
    # 绘制奇数行
    pu()
    goto(-edge*total_line//2, edge*total_line//2) # 居中偏移,不需要可删除
    pd()
    odd_count = 1
    for row in range((total_line + 1)//2):
        for _ in range(odd_count):
            draw(edge, diag_half)
            rt(135)
            fd(diag_full)
            rt(45)
        # 移动到下一个奇数行起始位
        pu()
        bk(edge * (odd_count + 1))
        rt(90)
        fd(edge*2)
        lt(90)
        pd()
        odd_count += 2
    
    # 绘制偶数行
    even_count = 2
    pu()
    goto(-edge*total_line//2 - edge/2, edge*total_line//2 - edge)
    pd()
    lt(180) # 偶数行统一旋转
    for row in range(total_line//2):
        for _ in range(even_count):
            draw(edge, diag_half)
            lt(180)
        # 移动到下一个偶数行起始位
        pu()
        rt(90)
        fd(edge*2)
        lt(90)
        bk(edge * even_count)
        pd()
        even_count += 2
    
    done()

精简后代码量比原版本减少近40%,去掉了所有全局变量和重复运算,运行效率更高。额外增加的居中绘制逻辑如果不需要,直接删除goto语句里的偏移计算即可。

内容的提问来源于stack exchange,提问作者Meno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:24:25