如何在Turtle Graphics Python中打破无限循环

时间:2016-03-06 13:21:47

标签: python

我为完成所需任务的作业编写了代码。这是从用户输入绘制多边形的形状,并绘制指定的每边数的形状数量。唯一的问题是在绘制形状之后箭头只是在无限循环中跟踪。我在最后尝试使用break,但它没有用。

 from turtle import *

def polygon(n, length):
    Screen()
    shape('turtle')
    mode('logo')

n = input ("Enter number of sides ")
print ("you entered ", n) 
length = input("Enter the length of sides ")
print ("you entered ", length)
n=int(n)
length=int(length)


for side in range(n):
    forward(length)
    right(360/n)
    while side in range(n):
        right(360/n)
        for side in range(n):
            forward(length)
            right(360/n)

到目前为止我所做的工作在技术上都适用于任务,但最后的无限循环让我感到烦恼。

1 个答案:

答案 0 :(得分:0)

主要问题是while循环持续了无限的时间。

#This is infinite loop because 'side' iterator is ALWAYS in the sequence returned from range function
while side in range(n):

此外,与目前的结构 你的代码中的函数什么都不做,只会浪费空间(你可能会从shell中调用它) 可以理解的)。还有一些我们可以驾驭的裁员。让我们设计你的脚本,以便乌龟 可以从您创建的函数控制多边形。希望你会看到乌龟模块有多强大 当与递归和函数的正确使用一起使用时。

让我们看一下多边形函数1st的声明。我觉得你的脚本应该围绕你的脚本的原因 除了函数的自然随意性之外,多边形函数是由于脚本中包含的参数。 虽然根据脚本的隐含设计不需要它们(至少这里),但是包含它们意味着A:你 用于控制乌龟的这个功能,或者B:你不太明白函数/参数是如何工作的。至 提供更多的学习经验,无论如何,我们都应该围绕该功能集中这个脚本。

def polygon(n,length): #<--- get ride of 'n' & 'length' parameters
def polygon(n=None,length=None): #<---These are defualt values if you wish to go with that direction
def polygon(): #<---This is the declaration I'll follow for aiding your script

暂时摆脱参数。稍后我们将把它们带回嵌套函数中。接下来我们将添加其余部分 多边形函数的脚本。因为n和length变量收集输入,所以它会渲染参数 对于多边形函数没用。它不是一个或两个,如果你有一些控制流,你可以拥有它们 通缉。在我们向多边形函数添加脚本之前,我想指出你如何声明两次变量, 第二次将它们转换为整数。 Python允许我们在第一次声明时将它们嵌套在int()函数中 它们。

n = input("Enter num ")
n = int(n) #<---instead of these 1st 2 lines, do the 3rd line below.
n = int(input("Enter num: ")) #<--1 line of code that is equally as readable as 2.

修改了n&amp;长度变量,让我们将所有内容添加到我们的多边形函数中(while循环除外) 摆脱所涉及的一切)。请注意,屏幕,形状和模式功能已移至下方 可变的谴责。这是因为在他们输入信息时,龟窗不会在用户面前跳跃 进入该计划。

def polygon():
    n = int(input("Enter number of sides: "))
    print("You entered %d sides.\n"%(n))
    length = int(input("Enter length of sides: "))
    print("Your sides are %d pixels long.\n"%(length))
    Screen()
    shape('turtle')
    mode('logo')

现在我们拥有一个干净且可读的功能,可以通过创建多边形来处理我们的业务。为此,我们将使用 嵌套函数,它使用递归和参数。我们称之为'looper'。原因是你的 赋值是制作等边的多边形(换句话说,多边形的数量== n)。 looper会 为我们实现这一目标。首先,它将在多边形中建立的变量作为参数。然后我们将使用你以前的 for loop in。

def looper(n,length,loops=n): #notice the 'loops=n' default parameter, this allows to keep track of it recursively
    if (loops > 0): #As long as loops is greater than zero this functin will repeat itself as many times as 'n'
        for side in range(n):
            forward(length)
            right(360/n)
        penup()
        #penup after the forloop so that the turtle will not draw while searching for next polygon space
        setposition(xcor()+length,ycor()+length) #xcor() and ycor() return the current position of the turtle
        #notice that we add it to the length of of our sides, this is how the turtle will space out the polys.
        #I would even experiment with things like setposition(xcor()+(length*2),ycor()+(length*2))
        pendown() #after turtle find the position we we use pendown() to prepare to draw again
        loops -= 1 #this decrements the loops parameter so that the functin will not call itself infinitely
        #(stack overflow)
        looper(n,length,loops) #recursively call our looper function again
        return #I personally always return the end of recursive functions to be safe, this may be redundant

本质上,递归是指函数在自身内部反复调用以执行任务。确保它 最终我们告诉程序:“只有在有任何循环时才绘制多边形”,此后函数执行 它的职责是我们告诉它“减去1循环”以确保循环最终为零。这和回归 声明(粗略等同于你所说的'休息')将向我们保证我们不会执行任务 无限次。此代码的最后一步是确保您实际调用多边形函数 因此,您的代码将运行AND以同样的原因调用looper(n,length)和多边形函数的结尾。

您的代码应如下所示:

from turtle import *

def polygon():
    n = int(input("Enter number of sides: "))
    print("You entered %d sides.\n"%(n))
    length = int(input("Enter length of sides: "))
    print("Your sides are %d pixels long.\n"%(length))
    Screen()
    shape('turtle')
    mode('logo')
    def looper(n,length,loops=n):
        if (loops > 0):
            for side in range(n):
            forward(length)
            right(360/n)
            penup()
            setposition(xcor()+length,ycor()+length)
            pendown()
            loops -= 1
            looper(n,length,loops)
            return
    looper(n,length)


polygon()

我几乎为你完成了任务,但如果你学到了一两件事,那么我的目标就实现了。我希望我帮助过任何事情!