字典控制龟的运动

问题描述:

我是编程新手,我试图解决我从学校获得的任务。我必须建立一个函数,使用乌龟来绘制一些东西,从一个字符串类型的参数(例如'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() 
+0

非常感谢你,先生。你是救生员。在你的帮助下,我管理着改变执行功能,所以现在它也需要LENGTH和ANGLE作为参数。我也忘记了拉姆达。所以,我的乌龟完全基于这个功能。再次,非常感谢。 –