替代 Lambda?

Alternative to Lambda?

Lambda 函数吓到我了。

我改编了一些代码,用一个来制作这个程序来探索"the 21 Game"的策略。

有人可以解释一下如何用更简单的结构替换 lambda 吗?据我所知,onclick() 不允许附加参数。

我最终会正确地学习 lambda,但我也想与肯定还没有准备好使用它们的学生分享这段代码。

import turtle

TURTLE_SIZE = 20
SQUARE_SIZE = 20

screen = turtle.Screen()
screen.setup(600,200)
screen.title("The 21 Game")
screen.bgcolor("black")

board = ['?'] * 21

screen.tracer(0)

for i in range(21):
    box = turtle.Turtle('square', visible=False)
    box.shapesize(SQUARE_SIZE / TURTLE_SIZE)
    box.color('Red')
    box.penup()
    box.goto(-220 + i * (SQUARE_SIZE + 2), 0)
    box.showturtle()
    box.stamp()

    board[i] = box
    box.onclick(lambda x, y, box=box, i=i: mouse(box, i))

screen.tracer(1)

def mouse(box, i):
    if box.color()[0] == "Red":
        box.color("Green")
    else:
        box.color("Red")

turtle.done()

lambda 表达式没什么用。它只是通过提供一个用作 return 值的表达式来定义一个函数。可以用 lambda 表达式定义的任何函数都可以用 def 语句定义。

在循环内显示,lambda x, y, box=box, i=i: mouse(box, i) 变为

for i in range(21):
    box = turtle.Turtle('square', visible=False)

    ...

    def my_func(x, y, box=box, i=i):
        return mouse(box, i)

    box.onclick(my_func)

您可以将 box.onclick(lambda x, y, box=box, i=i: mouse(box, i)) 替换为:

def mouse_callback(box, i):
    def action(x, y):
        mouse(box, i)
    return action
box.onclick(mouse_callback(box, i))

现在,现在,别告诉我嵌套作用域也吓到你了。

我可能会考虑在这种情况下使用 functools.partial。下面是我使用此函数对您的代码进行的修改以及需要考虑的其他一些更改:

from turtle import Screen, Turtle, mainloop
from functools import partial

TURTLE_SIZE = 20
SQUARE_SIZE = 20
COLOR_MAP = {'red': 'green', 'green': 'red'}

def mouse(x, y, box):
    box.fillcolor(COLOR_MAP[box.fillcolor()])

screen = Screen()
screen.setup(600, 200)
screen.title("The 21 Game")
screen.bgcolor('black')
screen.tracer(0)

board = []

for i in range(21):
    box = Turtle('square')
    box.shapesize(SQUARE_SIZE / TURTLE_SIZE)
    box.color('black', 'red')
    box.penup()
    box.setx(-220 + i * SQUARE_SIZE)
    box.onclick(partial(mouse, box=box))

    board.append(box)

screen.tracer(1)
mainloop()

partial 函数创建了一个锁定您的 box 参数的新函数。 (我还没有看到 i 参数的用途,但如果确实需要,您可以将它添加到 partial 调用中。)

我通过 pencolor 对比 fillcolor 启用乌龟自己的轮廓,从而消除了 2 像素的边框。 (您可以将其大小作为 shapesize() 的参数进行调整。)您不需要 stamp(),因为您的海龟哪儿也去不了——除非这个游戏有更多内容。 (同样,我看不到 board 的目的,除非这个游戏还有更多内容。)您不需要 visible=Falseshowturtle(),因为所有代码都在 tracer(0) 无论如何。

(我按照上面的方式处理了 mainloop,所以这可以 运行 在 Python 2 或 Python 3 下。)