51

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

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

4

6 に答える 6

73

許してください-私は抵抗できませんでした;-)

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)
于 2013-09-18T03:45:38.730 に答える
67

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

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

構造化された方法で考えるための鍵は、コードで分岐する方法と理由を理解することです。

たとえば、Pythongotoに対応する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 で記述する方法は次のとおりです

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).

于 2013-09-18T03:35:47.657 に答える
41

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

于 2013-09-18T03:53:23.793 に答える
9

gotoPython プログラミング言語には命令がありません。構造化された方法でコードを記述する必要があります...しかし、実際には、なぜ使用したいのgotoですか? それは何十年もの間、有害であると考えられgotoてきました。

もちろん、無条件のジャンプが役立つ場合もありますが、必須ではありません。goto

于 2013-09-18T03:23:29.007 に答える
7

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

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

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

以下を使用して、偽の python に似た言語で疑似コードのふりをしgotoます。

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'

明示的な名前付き例外は、非線形条件分岐を処理するための非常に優れた方法です

于 2013-09-18T03:39:45.067 に答える