私は独学でpython 2.7を教えています。GOTO ステートメントを持つ BATCH を使用した経験があります。Pythonでそれを行うにはどうすればよいですか? たとえば、5 行目から 18 行目にジャンプしたいとします。
このトピックに関して以前に質問があったことは承知していますが、十分な情報が得られなかったり、Python のレベルが高すぎて現在の理解には達していません。
許してください-私は抵抗できませんでした;-)
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)
Goto
s は、非常に構造化されていないコードにつながるため、コンピューター サイエンスとプログラミングの世界で広く非難されています。
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)
.
goto
私はそれが貧弱なコーディングであることに完全に同意しますが、実際に質問に答えた人は誰もいません。実際、Python には goto モジュールがあります(エイプリルフールのジョークとしてリリースされたものであり、使用は推奨されていませんが、動作します)。
goto
Python プログラミング言語には命令がありません。構造化された方法でコードを記述する必要があります...しかし、実際には、なぜ使用したいのgoto
ですか? それは何十年もの間、有害であると考えられgoto
てきました。
もちろん、無条件のジャンプが役立つ場合もありますが、必須ではありません。goto
免責事項: 私はかなりの量の 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'
明示的な名前付き例外は、非線形条件分岐を処理するための非常に優れた方法です。