2013-04-09 80 views
0

我有乌龟路线清单:如何使用Python在列表中填写龟的方向?

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)'] 

我怎样才能填补这一使用列表?

回答

-1

使用pendown,则fillcolor方法在一个循环:

def draw_n_fill(self,redlist): 
    self.pendown() 
    [self.getAttr(entry)() for entry in redlist] 
    self.fillcolor("red") 

参考

+0

此答案无效,也无法解决OP的问题。这些参考文献是非基础的。 (OP的问题中没有环,颜色和圆圈。)海龟没有'getAttr()'方法,导致异常。 – cdlane 2016-12-05 07:14:04

0

虽然这样的句法正确的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() 

对于那些谁想要提前读取,它绘制一个实心正方形。我上面提到的异常可能不是正确的,但重点在于,当您尝试执行作为字符串提交给您的代码时,您需要错误地检查所有内容,并引发异常。