我是编程的新手,我正试图解决我从学校得到的任务。我必须构建一个使用乌龟从类型字符串的参数中绘制内容的函数(例如' 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
循环。
你能否告诉我一些如何使这项工作成功的想法?或者如果我正在思考它?当然,不是代码:)...非常感谢
答案 0 :(得分:2)
代码的特定问题: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()