Python 函数与接口设计:用海龟画图学会编程思想
🎨 一行代码画正方形、多边形、圆形,真正理解封装与重构
4. 函数与接口
本章使用 jupyturtle 海龟绘图模块,通过画图学习:
4.1 jupyturtle 模块
jupyturtle 是简易绘图库,像指挥一只小海龟走路画线。
导入方式1(完整导入)
# 导入整个模块import jupyturtle# 创建画布与海龟jupyturtle.make_turtle()# 前进100单位jupyturtle.forward(100)
导入方式2(直接导入函数,更简洁)
# 从模块中导入需要的函数from jupyturtle import make_turtle, forward, left, right
基础指令
# 示例:前进 → 左转90度 → 再前进make_turtle()forward(50)left(90)forward(50)
4.2 画正方形
重复 4 次「前进+左转90°」即可画出正方形。
# 基础写法(重复代码)make_turtle()forward(50)left(90)forward(50)left(90)forward(50)left(90)forward(50)left(90)
用 for 循环简化:
# 循环4次,更简洁make_turtle()for i inrange(4): forward(50) left(90)
4.3 封装与泛化
封装(Encapsulation)
把重复代码包进函数,给它一个名字。
# 封装:画固定大小正方形defsquare():for i inrange(4): forward(50) left(90)# 调用make_turtle()square()
泛化(Generalization)
增加参数,让函数适应更多场景。
# 泛化:可指定边长defsquare(length):for i inrange(4): forward(length) left(90)# 画不同大小的正方形make_turtle()square(30)square(60)
进一步泛化:画正多边形
import math# n:边数 length:边长defpolygon(n, length):# 计算每次转的角度 angle = 360 / nfor i inrange(n): forward(length) left(angle)# 画7边形,边长30make_turtle()polygon(7, 30)
关键字参数(清晰不易错)
# 指定参数名,顺序可换polygon(n=7, length=30)
4.4 近似画圆
用超多边的多边形近似代替圆形。
import math# 根据半径画圆defcircle(radius):# 计算周长 circumference = 2 * math.pi * radius# 用30边近似圆 n = 30 length = circumference / n polygon(n, length)# 加速绘图:delay=0.02make_turtle(delay=0.02)circle(30)
4.5 重构(Refactoring)
重构:不改变功能,优化结构,提高复用性。
步骤1:提取公共代码 polyline
# 通用画线函数:n段,每段长length,转角angledefpolyline(n, length, angle):for i inrange(n): forward(length) left(angle)
步骤2:用 polyline 重写 polygon
defpolygon(n, length): angle = 360 / n polyline(n, length, angle)
步骤3:写圆弧函数 arc
# 画圆弧:radius半径,angle圆心角defarc(radius, angle): arc_length = 2 * math.pi * radius * angle / 360 n = 30 length = arc_length / n step_angle = angle / n polyline(n, length, step_angle)
步骤4:用 arc 重写 circle
defcircle(radius):# 360度就是整圆 arc(radius, 360)
重构好处:
4.6 栈图(调用关系)
调用链: circle → arc → polyline
每个函数的参数都是局部独立的。
circle(radius=30)arc(radius=30, angle=360)polyline(n=60, length=3.04, angle=5.8)
4.7 开发流程:封装→泛化→重构
接口 vs 实现
接口不变,实现可以随便改。
4.8 文档字符串(Docstring)
函数开头用三引号写注释,说明接口用途。
defpolyline(n, length, angle):"""画n段连续直线 n:线段数量 length:每段长度 angle:相邻线段转角(度) """for i inrange(n): forward(length) left(angle)
Docstring 作用:
4.9 调试:前置条件与后置条件
如果前置满足、后置不满足 → bug 在函数里 如果前置不满足 → bug 在调用方
4.10 术语表
4.11 练习(海龟绘图)
先额外导入两个函数:
from jupyturtle import penup, pendown# 无痕迹移动defjump(length):"""前进但不画线 结束后画笔保持落下 """ penup() forward(length) pendown()
4.11.1 画长方形 rectangle
4.11.2 画菱形 rhombus
4.11.3 画平行四边形 parallelogram
4.11.4 画饼状图
4.11.5 画花朵(用 arc 画花瓣)
4.11.6 让 AI 帮你写螺旋线
📚 原文:Think Python 3rd Edition ✍️ 作者:Allen B. Downey