字典控制龟的运动
问题描述:
我是编程新手,我试图解决我从学校获得的任务。我必须建立一个函数,使用乌龟来绘制一些东西,从一个字符串类型的参数(例如'fdltfd' - 向前移动,向左和向前移动)。这些命令位于字典中,因此我必须将字符串中的元素与字典键进行比较。如果它们匹配,则命令龟移动。我写的代码:字典控制龟的运动
def execute(turtle, length, args, *cmd):
map = {'fd': turtle.fd(length), 'lt': turtle.lt(args), 'bk': turtle.bk(length), 'rt': turtle.rt(args), 'nop':None}
for command in cmd:
if command in map.keys():
map[command]()
execute(bob, 50, 45, 'fdltfd')
的问题是,乌龟不只是什么是在词典中,向前,后,左,右,它根本不屑看我for
循环。
你可以给我一些关于如何做这项工作的想法吗?或者如果我正在考虑它是正确的?当然,并不是说代码:)......非常感谢你
答
具体问题与您的代码:在cmd
参数前面的星号是不正确:
def execute(turtle, length, args, *cmd):
给你的方式”重新调用它:
execute(bob, 50, 45, 'fdltfd')
所以摆脱星号。参数turtle
也是一个包的名称,因此可以对其进行更改,例如my_turtle
。同样,map
是内置Python的名称,因此请对其进行更改。
你的字典应该包含调用的函数,而不是调用函数的结果。即而不是:
map = {'fd': turtle.fd(length), 'lt': turtle.lt(args), 'bk': turtle.bk(length), 'rt': turtle.rt(args), 'nop':None}
我期望更多的东西一样:
commands = {'fd': turtle.fd, 'lt': turtle.lt, 'bk': turtle.bk, 'rt': turtle.rt, 'nop': None}
或:
LENGTH = 50
ANGLE = 45
commands = { \
'fd': lambda t: t.fd(LENGTH), \
'lt': lambda t: t.lt(ANGLE), \
'bk': lambda t: t.bk(LENGTH), \
'rt': lambda t: t.rt(ANGLE), \
}
鉴于cmd
,'fdltfd'
的价值,我不看你怎么指望这工作:
for command in cmd:
因为它会在字典中查找'f','d','l','t'等,而不是'fd','lt'等。您可能想要更类似的东西:
# 'fdltfd' -> ['fd', 'lt', 'fd']
for command in [a + b for a, b in zip(cmd[0::2], cmd[1::2])]:
把上述所有一起,我们得到了一个粗略的实现,主要作品:
import turtle
LENGTH = 50
ANGLE = 45
commands = { \
'fd': lambda t: t.fd(LENGTH), \
'lt': lambda t: t.lt(ANGLE), \
'bk': lambda t: t.bk(LENGTH), \
'rt': lambda t: t.rt(ANGLE), \
}
def execute(my_turtle, cmd):
for command in [a + b for a, b in zip(cmd[0::2], cmd[1::2])]:
if command in commands:
commands[command](my_turtle)
execute(turtle.Turtle(), 'fdltfdltfdltfdltfdltfdltfdltfd')
turtle.mainloop()
非常感谢你,先生。你是救生员。在你的帮助下,我管理着改变执行功能,所以现在它也需要LENGTH和ANGLE作为参数。我也忘记了拉姆达。所以,我的乌龟完全基于这个功能。再次,非常感谢。 –