【问题标题】:python alternative to the goto command?python替代goto命令?
【发布时间】:2010-12-14 19:38:20
【问题描述】:

我有一个基本上由海龟图形组成的python程序,它基本上是询问用户要绘制多少个正方形,然后在每个正方形之后,它使用以下方法将计数器加1:

counter=1
<drawing code here>
counter +=1

然后我想检查一下正方形的数量是否等于用户输入的数量,如果是,那么我想转到脚本的底部让它说像done!!。但我不知道如何让它转到脚本的某个部分,因为我习惯于批量使用的 goto 命令在 python 中不受支持(我知道,goto= 意大利面条代码)

我发现一个简单的解决方法是下载某人制作的模块,该模块可让您将 goto 命令导入 python 并像批量一样使用它,但如果有的话,我想要一个原生 python 解决方案!

我当前的代码是:

from turtle import *
import time
counter=1
color("red", "blue")
down()

user=int(raw_input('how many balls do you want?'))
counter +=1
if user===counter:

# solution goes here!

else:

for step in range(24):
        right(105)
        forward(100)
        right(105)
        forward(100)
        right(105)
        forward(100)
        right(105)
        forward(100)

up()
goto(120,0)
down()


counter +=1
if user==counter:

#solution goes here!

else:

for step in range(24):
        right(105)
        forward(100)
        right(105)
        forward(100)
        right(105)
        forward(100)
        right(105)
        forward(100)

up()
goto(0,-50)
write("Done!")

time.sleep(5) 

如果您对此问题有答案或替代方案,我们将不胜感激!

【问题讨论】:

  • 你不使用函数有什么原因吗?
  • goto(120,0) 似乎将您重新定位在 (x,y)。它看起来像一个函数,而不是您在某些直接控制指定代码的编程语言中找到的 goto。至少从第一眼看,是这样的。
  • 呃....您从turtle 模块获得的goto 与跳转到脚本中的其他地方完全无关...它设置了海龟的位置。无论如何,您完成这项工作的方式是构建您的代码。假装您从未听说过“goto”,从一开始就了解真正的控制结构是如何工作的。
  • @pyfunc:他的意思是另一种“goto”,结构化编程应该淘汰的那种。
  • 你做错了(tm)。您需要学习如何使用函数、循环等来构建代码。学习另一种语言的程序员可能会跳过该语言的教程(当然,直到他们遇到麻烦),但如果您之前的经验只是批处理脚本,则没有必要通过不遵循编写良好的教程/书籍,使事情变得困难一百倍。我推荐How to Think like a computer scientist

标签: python batch-file goto turtle-graphics


【解决方案1】:

这有帮助吗?

import turtle   # don't pollute the namespace
import time

def getInt(msg):
    return int(raw_input(msg))

def drawBall():
    turtle.down()
    for i in range(96):
        turtle.right(105)
        turtle.forward(100)
    turtle.up()

def moveOver():
    turtle.goto(120,0)

def Done():
    turtle.goto(0,-50)
    turtle.write('Done!')
    time.sleep(5)

def main(): 
    turtle.color('red','blue')
    for i in range(getInt('How many balls do you want?')):
        drawBall()
        moveOver()
    Done()

if __name__=="__main__":
    main()

不要考虑一长串指令。而是考虑将您的问题分解为较小的动作,例如“画一个球”,并将每个动作写成一个过程;然后考虑如何将这些程序结合在一起以实现您的目标。重复编写相同的代码表明你做错了。

【讨论】:

  • ok,这段代码没有错误,但也打不开!它会在屏幕上闪烁控制台大约 0.1 秒,然后无错误地关闭……有什么想法吗?
  • @Daniel11:两种运行方式:首先,剪切并粘贴到交互式会话中;其次,另存为(例如)myturtle.py,然后从命令行“python -i myturtle.py”运行(-i 告诉解释器在脚本结束时保持交互模式)。
  • 等等,你上面贴的程序只是定义了变量,你是说我必须做你贴的,然后输入right(90)或forward(110)等指令吗?因为您发布的脚本实际上并没有显示任何内容...
  • @Daniel11: 嗯...你现在如何运行python?比如,如果你想运行 'print("Hello, world")',你会怎么做?
【解决方案2】:

不要检查正方形的个数就走到最后,而是循环适当的次数,每次画一个正方形。

【讨论】:

    【解决方案3】:

    一些提示:

    >>> def square():
        print "+--+"
        print "|  |"
        print "|  |"
        print "+--+"
        print
    
    
    >>> range(5)
    [0, 1, 2, 3, 4]
    >>> for x in range(5):
        print x
        square()
    
    
    0
    +--+
    |  |
    |  |
    +--+
    
    1
    +--+
    |  |
    

    [剪辑]

    【讨论】:

      【解决方案4】:

      将您的代码分解为函数,然后在您想跳过函数的剩余代码时使用return

      更新:正如评论者显然假设的那样,我不一定宽恕一个函数的多个退出点;这个答案是在问题的背景下。我对多出口问题的看法与 Tim Peters 的 that 一致:

      嗯,单出口是最好的,因为它总是使检测更容易,并且 通常使推理更容易(直到替代方案引入了这么多 愚蠢的布尔标志,表明跟踪这些比疾病更糟)。

      【讨论】:

      • 虽然没有 goto 那么糟糕,但这通常是一种不好的编程习惯——当函数总是在一个地方退出时,调试它会容易得多。
      • @Hugh:问题很明确:Python 替代了 goto 命令,所以在这种情况下,我认为我的回答很有用;我们显然不同意上下文。
      • @TZ?:令我尴尬的是,我在写完评论后不久就发现自己使用了这种模式。当然,它有它的位置,并且在谨慎使用时可以使函数更具可读性 - 但俗话说,你需要知道规则才能智能地打破它们;-)
      猜你喜欢
      • 1970-01-01
      • 2018-07-21
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多