如何让函数每次接收后续参数?及用Turtle绘制矩形堆的代码问题
问题解答
1. 如何编写一个每次调用时能接收后续参数的函数?
针对这个需求,分两种常见场景给你具体实现方案:
场景1:每次调用可接收任意数量的参数(无需保存历史)
如果只是需要函数每次调用都能灵活接收后续的位置/关键字参数,直接用Python的可变参数语法*args(接收位置参数)和**kwargs(接收关键字参数)就可以:
def accept_follow_args(*args, **kwargs): print("本次传入的位置参数:", args) print("本次传入的关键字参数:", kwargs) # 调用示例 accept_follow_args(1, 2, username="Jack") accept_follow_args("hello", 3.14, age=30, city="New York")
场景2:需要累积保存每次调用的参数(记录历史)
如果要让函数记住每次调用传入的参数,用闭包(嵌套函数)来维护内部状态是个很简洁的方式,也可以用类来封装:
闭包实现
def make_param_accumulator(): # 内部变量保存所有历史参数 all_params = [] def accumulator(*args): all_params.extend(args) return all_params return accumulator # 使用方式 acc = make_param_accumulator() print(acc(1, 2)) # 输出 [1, 2] print(acc(3, "apple")) # 输出 [1, 2, 3, 'apple'] print(acc(True)) # 输出 [1, 2, 3, 'apple', True]
类实现(更直观,适合复杂场景)
class ParamAccumulator: def __init__(self): self.history = [] def add_params(self, *args): self.history.extend(args) return self.history # 使用方式 acc = ParamAccumulator() print(acc.add_params(10, 20)) print(acc.add_params("test"))
2. 完善Python Turtle代码绘制3组矩形堆
先帮你梳理下现有代码的问题:当前循环会遍历整个列表画矩形,但没有区分不同组,而且画完后只是向上移动,没有处理组与组之间的横向偏移,导致所有矩形都堆在同一个位置。
下面是完善后的代码,完全实现你的需求:
from turtle import * myList = [[1, 6], [2, 2], [3, 9]] RECT_WIDTH = 220 RECT_HEIGHT = 50 GROUP_GAP = 50 # 组与组之间的横向间距 def draw_one_rect(): """封装单个填充矩形的绘制逻辑,代码更清晰""" pendown() color('Black', 'Aquamarine') begin_fill() # 用循环画矩形,比重复写四次转向更简洁 for _ in range(2): forward(RECT_WIDTH) left(90) forward(RECT_HEIGHT) left(90) end_fill() penup() def draw_rect_stack(num): """绘制一组包含num个矩形的堆叠""" for _ in range(num): draw_one_rect() # 向上移动一个矩形高度,准备画下一个 setheading(90) forward(RECT_HEIGHT) # 画完一组后,回到该组的底部位置,方便移动到下一组 setheading(270) forward(RECT_HEIGHT * num) # 初始化起始位置,确保所有组都能在窗口内显示 penup() goto(-350, -250) # 遍历每个组,依次绘制 for group in myList: stack_count = group[1] draw_rect_stack(stack_count) # 向右移动到下一组的起始位置(矩形宽度+间距) setheading(0) forward(RECT_WIDTH + GROUP_GAP) done() # 保持绘图窗口不关闭
代码说明:
- 把单个矩形的绘制封装成
draw_one_rect函数,减少重复代码,也方便后续修改样式 draw_rect_stack负责绘制一组堆叠的矩形,画完后自动回到组的底部,避免位置混乱- 初始位置设置在窗口左下方,防止图形超出可视范围
- 组之间通过横向移动
RECT_WIDTH + GROUP_GAP来分隔,保证各组不重叠 - 最后用
done()让窗口保持打开,不会运行后立刻关闭
运行这段代码后,你就能看到3组分别有6、2、9个矩形的堆叠效果了。
内容的提问来源于stack exchange,提问作者Jack Mcsweeney




