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