当前位置:首页>python>一种全新的思维方式|《Think Python》第4章

一种全新的思维方式|《Think Python》第4章

  • 2026-09-02 19:14:18
一种全新的思维方式|《Think Python》第4章

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

基础指令

  • 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 开发流程:封装→泛化→重构

  1. 先写小段代码跑通
  2. 封装成函数
  3. 泛化加参数
  4. 重构优化结构
  5. 重复直到程序清晰

接口 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 术语表

英文
中文
含义
interface
接口
函数如何被使用
encapsulation
封装
代码打包成函数
generalization
泛化
加参数,增强通用性
refactoring
重构
优化结构,不改功能
docstring
文档字符串
函数说明注释
precondition
前置条件
调用前必须满足
postcondition
后置条件
函数执行后保证

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

最新文章

随机文章