web-dev-qa-db-ja.com

pythonのGOTOに相当

私は自分でpython 2.7を独学しています。 GOTOステートメントがあるBATCHを使用した経験があります。どうすればPythonでそれを行うのですか?たとえば、5行目から18行目にジャンプしたいとします。

このトピックに関して以前に質問があったことは承知していますが、十分な情報が得られなかったか、pythonのレベルが高すぎて現在の理解が得られていません。

40
Calder Hutchins

Gotosは非常に構造化されていないコードにつながるため、コンピューターサイエンスとプログラミングで広く非難されています。

Python(今日のほとんどすべてのプログラミング言語と同様)は、if-then/else、ループ、サブルーチンを使用してフローを制御する 構造化プログラミング をサポートしています。

構造化された方法で考えるための鍵は、コードでどのように、そしてなぜ分岐しているのかを理解することです。

たとえば、Pythonにgotoおよび対応するlabelステートメントshudderを装ったとします。次のコードを見てください。数値が0以上の場合、その場合は印刷します

number = input()
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end
label: negative
print "negative"
label: end
print "all done"

コードがいつ実行されたかを知りたい場合は、プログラムを慎重にトレースバックし、ラベルがどのように到達したかを調べる必要があります。これは実際には実行できません。

たとえば、上記を次のように書き換えることができます。

number = input()
goto check

label: negative
print "negative"
goto end

label: check
if number < 0: goto negative
if number % 2 == 0:
   print "even"
else:
   print "odd"
goto end

label: end
print "all done"

ここでは、「終わり」に到達する2つの可能な方法があり、どちらが選択されたかを知ることはできません。プログラムが大きくなると、この種の問題は悪化し、 スパゲッティコード になります。

比較として、以下は、このプログラムをPythonでどのように書くかwouldです。

number = input()
if number >= 0:
   if number % 2 == 0:
       print "even"
   else:
       print "odd"
else:
   print "negative"
print "all done"

特定のコード行を見て、それが含まれるif/then/elseブロックのツリーをトレースバックすることで、どのような条件で満たされるかを知ることができます。たとえば、print "odd"行が実行されることを知っています((number >= 0) == True) and ((number % 2 == 0) == False)の場合。

56
user764357

許して-抵抗できなかった;-)

def goto(linenum):
    global line
    line = linenum

line = 1
while True:
    if line == 1:
        response = raw_input("yes or no? ")
        if response == "yes":
            goto(2)
        Elif response == "no":
            goto(3)
        else:
            goto(100)
    Elif line == 2:
        print "Thank you for the yes!"
        goto(20)
    Elif line == 3:
        print "Thank you for the no!"
        goto(20)
    Elif line == 20:
        break
    Elif line == 100:
        print "You're annoying me - answer the question!"
        goto(1)
54
Tim Peters

gotoは貧弱で貧弱なコーディングであることに完全に同意しますが、実際に誰も質問に答えていません。そこにis実際には Pythonのgotoモジュール (エイプリルフールのジョークとしてリリースされたため、推奨されません使用、それdoes作業)。

35
scohe001

Pythonプログラミング言語にはgoto命令はありません。 構造化 の方法でコードを記述する必要があります...しかし、本当に、なぜgotoを使用したいのですか?それは 有害と見なされる であり、あなたが考えることができるプログラムはgotoを使用せずに書くことができます。

もちろん、いくつかの cases があり、無条件ジャンプは役に立つかもしれませんが、決してありませんmandatorygotoを必要としない意味的に同等の構造化ソリューションが常に存在します。

9
Óscar López

免責事項:かなりの量のF77にさらされています

goto(議論の余地がある、私の意見のみなど)の現代的な同等物は、明示的な例外処理です。

コードの再利用を強調するために編集されています。

gotoを使用して、偽のPython風の言語で擬似コードを装います。

def myfunc1(x)
    if x == 0:
        goto LABEL1
    return 1/x

def myfunc2(z)
    if z == 0:
        goto LABEL1
    return 1/z

myfunc1(0) 
myfunc2(0)

:LABEL1
print 'Cannot divide by zero'.

Pythonと比較して:

def myfunc1(x):
    return 1/x

def myfunc2(y):
    return 1/y


try:
    myfunc1(0)
    myfunc2(0)
except ZeroDivisionError:
    print 'Cannot divide by zero'

明示的な名前付き例外は、非線形条件分岐を処理する重要より良い方法です。

6
Caleb Hattingh
answer = None
while True:
    answer = raw_input("Do you like pie?")
    if answer in ("yes", "no"): break
    print "That is not a yes or a no"

Gotoステートメントを使用せずに、必要なものを提供します。

4
Paul Becotte