我有一张海龟方向的清单:
redlist = ['seth(0)', 'forward(drawdist)', 'seth(0)', 'forward(drawdist)', 'seth(90)', 'forward(drawdist)', 'seth(90)', 'forward(drawdist)', 'seth(180)', 'forward(drawdist)', 'seth(180)', 'forward(drawdist)', 'seth(270)', 'forward(drawdist)', 'seth(270)', 'forward(drawdist)']我如何使用列表填写此表?
发布于 2016-12-05 15:09:30
尽管像这样一系列语法正确的Python语句看起来是使用eval()的好机会,但还是要抵制住这种诱惑。这里的语法非常简单,只有一个参数的函数,我们可以使用re模块来解析命令,并且只对有效参数执行看起来有效的函数:
import turtle
import re
redist = [ \
'seth(0)', 'forward(drawdist)', 'seth(0)', 'forward(drawdist)', \
'seth(90)', 'forward(drawdist)', 'seth(90)', 'forward(drawdist)', \
'seth(180)', 'forward(drawdist)', 'seth(180)', 'forward(drawdist)', \
'seth(270)', 'forward(drawdist)', 'seth(270)', 'forward(drawdist)' \
]
valid_functions = { \
'seth': turtle.setheading, \
'forward': turtle.forward, \
}
valid_arguments = { \
'drawdist': 50, \
}
turtle.begin_fill()
for command in redist:
match = re.match(r"^(\w+)\((\w+)\)$", command)
if match is None:
raise SyntaxError("Invalid syntax")
function, argument = match.group(1), match.group(2)
if function not in valid_functions:
raise ValueError("Invalid function")
if argument in valid_arguments:
argument = valid_arguments[argument]
elif argument.isdigit():
argument = int(argument)
else:
raise TypeError("Invalid argument")
valid_functions[function](argument)
turtle.end_fill()
turtle.hideturtle()
turtle.mainloop()对于那些想要提前阅读的人来说,它会绘制一个实心的方块。我在上面提出的异常可能不是正确的,但重点是,当试图执行作为字符串传递给您的代码时,您需要对所有内容进行错误检查,并引发异常。
发布于 2013-10-12 06:02:50
在循环中使用pendown,然后使用fillcolor方法:
def draw_n_fill(self,redlist):
self.pendown()
[self.getAttr(entry)() for entry in redlist]
self.fillcolor("red")参考
https://stackoverflow.com/questions/15895996
复制相似问题