在列表中添加命名海龟?



我目前正在做一个迷你项目,用户输入一个数字,然后生成该数量的海龟并跑到中间。这些海龟是通过while语句创建的,然后使用嵌套的if语句以其颜色命名。

有没有办法列出这些海龟的列表,或者有办法将它们添加到一个列表中,我可以在比赛中使用随机函数来确保每个转弯都有随机颜色移动。我似乎无法列出包含海龟名称的列表。(下面是我的代码的简化和重点版本。

import turtle
y = turtle.turtle()
Racers = []
if Z == "Blue":
Blue = y
Racers.append(Blue)
elif Z == "Yellow":
Yellow = y
Racers.append(Blue)
etc.

目前还不完全清楚你想使用这些名称做什么,以及你想在哪里访问它们,但我会给你两种不同的设计,不同的功能。

首先,您可以保留一个字典,而不是对象列表,将名称映射到对象:

Racers = {}
y = turtle.turtle()
z = "Blue"
Racers[z] = y

现在,如果您想要所有名称的列表,那只是Racers中所有键的列表:

list(Racers)

或者,如果你实际上不需要列表,你只需要循环访问它们,只需使用Racers本身 - 当你循环字典时,你会得到它的键。

如果你想要一个对象列表,那就是值:

Racers.values()

如果要将名称和对象循环在一起,则为以下项:

for name, racer in Racers.items():
print(name)
racer.do_something()

这种设计的问题在于你有一只,你想知道他的名字,找出答案的唯一方法是遍历items()的每一name, racer,直到找到匹配的那只。如果你永远不必这样做,这是一个伟大的设计,但如果你这样做,它就不是。


或者,您可以将名称作为额外属性存储在 turtle 对象本身上。您不想调用属性color,因为这在 turtle 对象上隐藏了一个有用的方法,但您可以调用它,比如说,name

Racers = []
y = turtle.turtle()
y.name = "Blue"
Racers.append(y)

现在你只有一个海龟名单。如果您想打印出获胜者的名字,那就更容易了:

print('The winning turtle is', winning_turtle.name)

但是,如果您想按名称查找,唯一的方法是遍历所有海龟并检查它们的name,直到找到合适的。


因此,这两种设计都有权衡。还有其他可能的设计(当然包括结合上面的两个想法),它们都有自己的权衡。在选择数据结构之前,准确确定如何使用数据非常重要。但是,一旦你解决了这个问题,可能有一种方法可以做到这一点,如果你自己想不通,你可以在这里问一个新问题。

最新更新