You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让函数每次接收后续参数?及用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

火山引擎 最新活动