Python 每次调用函数时,命令是否可以更改?

Python 每次调用函数时,命令是否可以更改?,python,arrays,turtle-graphics,Python,Arrays,Turtle Graphics,例如,我试着写turtle.direction[x]。方向是一个字符串数组,字符串是海龟命令。因此,如果我遍历direction数组,每次调用drawPoint时,它都会更改turtle命令 我可以看到您在这里试图做什么: def drawPoint(direction, x): turtle.(direction[x])(1) turtle.forward(1) x = x + 1 drawPoint(direction, x%2) def ma

例如,我试着写turtle.direction[x]。方向是一个字符串数组,字符串是海龟命令。因此,如果我遍历direction数组,每次调用drawPoint时,它都会更改turtle命令

我可以看到您在这里试图做什么:

def drawPoint(direction, x):
    turtle.(direction[x])(1)
    turtle.forward(1)
    x = x + 1
    drawPoint(direction, x%2)       

def main():
     x = 0
     myTurtle = turtle.Turtle()
     myWindow = turtle.Screen()
     direction = ['right', 'left', 'up', 'down']
     drawPoint(direction, x)
您希望使用方向[x]中的字符串作为方法的名称。你可能不想那样做,但你可以。只是不直接;您必须使用以下功能:

turtle.(direction[x])(1)
无论如何,使用getattr通常不是一个好主意。更好的办法是将方法存储在列表中,而不是将其名称存储在列表中。就像其中一个:*

getattr(turtle, direction[x])(1)
第一个版本创建了一个绑定方法列表,这些方法知道它们附加到myTurtle的对象,因此您可以只调用方向[0]1。第二种方法创建一个未绑定方法的列表,这些方法不知道它们附加到哪个对象;您必须像参数[0]myTurtle,1那样显式地传递它。我认为后者在这种情况下更有意义,因为下一点,但两者都是完全正确的

这里还有另一个问题:海龟不是你的海龟对象,它是一个模块。您需要处理一些对象,但在绘图点中没有。幸运的是,您在main中创建了一个名为myTurtle的文件,所以只需将其传递给drawPoint即可

最后,如果您想要迭代,请使用循环,而不是对自己的递归调用。否则,在第1000次循环中,您将得到一个异常,并且您的程序将以一个难看的堆栈跟踪退出**

因此:

再来一个漂亮的把戏。如果要在列表上永久循环,而不是跟踪索引并使用%重置回0,则可以使用该函数。在这种情况下,我们只想循环方向的前两个元素,因此我们将使用一个切片:

def drawPoint(myTurtle, direction, x):
    while True:
        direction[x](myTurtle)(1)
        myTurtle.forward(1)
        x = x + 1
        x %= 2

def main():
     x = 0
     myTurtle = turtle.Turtle()
     myWindow = turtle.Screen()
     direction = ['right', 'left', 'up', 'down']
     drawPoint(myTurtle, direction, x)
*在Python中,所有内容都是一级值模块、类、对象、函数、绑定和未绑定方法等。这意味着您可以将其粘贴在列表中,并将其传递给函数,无论您想要什么

**每次调用另一个函数时,它都会在堆栈上推送另一个帧。当您返回时,它会从堆栈中弹出一帧。但是如果您的函数在返回之前调用另一个函数,并且在返回之前调用另一个函数,等等,那么您最终会溢出堆栈。为了避免低级语言的严重崩溃和安全漏洞,Python不会让您走那么远,当您走到1000深时会引发异常。如果您习惯了另一种语言,比如Scheme,这让您感到惊讶,这是因为Scheme会消除尾部调用,而Python不会;更一般地说,Scheme旨在鼓励尽可能多的递归,而Python旨在阻止递归

def drawPoint(myTurtle, direction, x):
    while True:
        direction[x](myTurtle)(1)
        myTurtle.forward(1)
        x = x + 1
        x %= 2

def main():
     x = 0
     myTurtle = turtle.Turtle()
     myWindow = turtle.Screen()
     direction = ['right', 'left', 'up', 'down']
     drawPoint(myTurtle, direction, x)
import itertools

def drawPoint(myTurtle, direction, x):
    for dir in itertools.cycle(direction[:2]):
        dir(myTurtle)(1)
        myTurtle.forward(1)