如何精简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
相关产品推荐
相关产品推荐

