我为完成所需任务的作业编写了代码。这是从用户输入绘制多边形的形状,并绘制指定的每边数的形状数量。唯一的问题是在绘制形状之后箭头只是在无限循环中跟踪。我在最后尝试使用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)
到目前为止我所做的工作在技术上都适用于任务,但最后的无限循环让我感到烦恼。
答案 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()
我几乎为你完成了任务,但如果你学到了一两件事,那么我的目标就实现了。我希望我帮助过任何事情!