字典控制乌龟的运动
A dictionary controls a turtle's movement
我是编程新手,我正在尝试解决我从学校得到的任务。我必须构建一个函数,该函数使用海龟从字符串类型的参数(例如 '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内建的名字,所以改成
您的字典应该包含要调用的函数,而不是调用函数的结果。 IE。而不是:
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()
我是编程新手,我正在尝试解决我从学校得到的任务。我必须构建一个函数,该函数使用海龟从字符串类型的参数(例如 '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内建的名字,所以改成
您的字典应该包含要调用的函数,而不是调用函数的结果。 IE。而不是:
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()