from goto import with_goto
@with_goto
def range(start, stop):
i = start
result = []
label .begin
if i == stop:
goto .end
result.append(i)
i += 1
goto .begin
label .end
return result
# Example 1: Breaking out from a deeply nested loop:
from goto import goto, label
for i in range(1, 10):
for j in range(1, 20):
for k in range(1, 30):
print i, j, k
if k == 3:
goto .end
label .end
print "Finished\n"
import dis, new
def goto(fn):
"""
A function decorator to add the goto command for a function.
Specify labels like so:
label .foo
Goto labels like so:
goto .foo
Note: you can write a goto statement before the correspnding label statement
"""
labels = {}
gotos = {}
globalName = None
index = 0
end = len(fn.func_code.co_code)
i = 0
# scan through the byte codes to find the labels and gotos
while i < end:
op = ord(fn.func_code.co_code[i])
i += 1
name = dis.opname[op]
if op > dis.HAVE_ARGUMENT:
b1 = ord(fn.func_code.co_code[i])
b2 = ord(fn.func_code.co_code[i+1])
num = b2 * 256 + b1
if name == 'LOAD_GLOBAL':
globalName = fn.func_code.co_names[num]
index = i - 1
i += 2
continue
if name == 'LOAD_ATTR':
if globalName == 'label':
labels[fn.func_code.co_names[num]] = index
elif globalName == 'goto':
gotos[fn.func_code.co_names[num]] = index
name = None
i += 2
# no-op the labels
ilist = list(fn.func_code.co_code)
for label,index in labels.items():
ilist[index:index+7] = [chr(dis.opmap['NOP'])]*7
# change gotos to jumps
for label,index in gotos.items():
if label not in labels:
raise Exception("Missing label: %s"%label)
target = labels[label] + 7 # skip NOPs
ilist[index] = chr(dis.opmap['JUMP_ABSOLUTE'])
ilist[index + 1] = chr(target & 255)
ilist[index + 2] = chr(target >> 8)
# create new function from existing function
c = fn.func_code
newcode = new.code(c.co_argcount,
c.co_nlocals,
c.co_stacksize,
c.co_flags,
''.join(ilist),
c.co_consts,
c.co_names,
c.co_varnames,
c.co_filename,
c.co_name,
c.co_firstlineno,
c.co_lnotab)
newfn = new.function(newcode,fn.func_globals)
return newfn
if __name__ == '__main__':
@goto
def test1():
print 'Hello'
goto .the_end
print 'world'
label .the_end
print 'the end'
test1()
for a in xrange(1,10):
get_out = False
for b in xrange(1,5):
if(get_out): break
for c in xrange(1,5):
if(get_out): break
for d in xrange(1,5):
# do some stuff
if(condition(e)):
get_out = True
break
def sample():
print "This room is full of gold how much do you want?"
choice = raw_input("> ")
how_much = int(choice)
if "0" in choice or "1" in choice:
check(how_much)
else:
print "Enter a number with 0 or 1"
sample()
def check(n):
if n < 150:
print "You are not greedy, you win"
exit(0)
else:
print "You are nuts!"
exit(0)
class id:
def data1(self):
name=[]
age=[]
n=1
while n>0:
print("1. for enter data")
print("2. update list")
print("3. show data")
print("choose what you want to do ?")
ch=int(input("enter your choice"))
if ch==1:
n=int(input("how many elemet you want to enter="))
for i in range(n):
name.append(input("NAME "))
age.append(int(input("age ")))
elif ch==2:
name.append(input("NAME "))
age.append(int(input("age ")))
elif ch==3:
try:
if name==None:
print("empty list")
else:
print("name \t age")
for i in range(n):
print(name[i]," \t ",age[i])
break
except:
print("list is empty")
print("do want to continue y or n")
ch1=input()
if ch1=="y":
n=n+1
else:
print("name \t age")
for i in range(n):
print(name[i]," \t ",age[i])
n=-1
p1=id()
p1.data1()
いいえ、Pythonはラベルやgotoをサポートしていません。Pythonは(高度に)構造化されたプログラミング言語です。
Pythonでは、gotoでできることのいくつかをファーストクラス関数を使って行うことができる。 例えば
Pythonではこのようになります:
尤も、これはgotoを代用する最良の方法ではない。 しかし、あなたがgotoで何をしようとしているのかが正確にわからないと、具体的なアドバイスをするのは難しいです。
ascobol]1を参照のこと:
関数で囲むか、例外を使うのが一番です。 関数の場合
例外の場合
このようなことをするために例外を使うのは、他のプログラミング言語から来た人には少し厄介に感じるかもしれません。 しかし、もし例外を使うのが嫌いなら、Python はあなたのための言語ではないと主張します。)
私は最近、Pythonで「goto」を可能にする関数デコレーター1を書きました。
なぜそのようなことをしたいのか、私にはわかりません。 とはいえ、私はそれほど深刻ではありません。 しかし、この種のメタプログラミングは、Python、少なくともCPythonとPyPyで実際に可能であり、デバッガーAPIを他の男のように誤用するだけではないことを指摘しておきます。 ただし、バイトコードをいじる必要があります。
これは公式python Design and History FAQで見つかりました。
これが公式のFAQでも言及されており、優れたソリューションサンプルが提供されていることは非常に素晴らしいことです。 コミュニティはこのように「ゴト」さえ扱っているので、私は本当にpythonが好きです;)。
bobince
'さんのコメントからの提案を使って、
@ascobol`'さんの質問に答えます1:else
ブロックのインデントは正しいです。このコードはループの後に不明瞭な
else` を使っています。Python はなぜ for ループや while ループの後に 'else' を使うのか](https://stackoverflow.com/q/9979970/4279) を参照してください。作業バージョンが作成されました:http://entrian.com/goto/。
注:エイプリルフールのジョークとして提供されました。 (しかし働いています)。
言うまでもない。 はい、面白いですが、使用しないでください。
「ブレイク」と「コンティニュー」のラベルは、2007年のPEP 3136で提案されましたが、拒否されました。 提案の動機セクションは、Pythonで「ブレイク」というラベルを付けたものを模倣するためのいくつかの一般的な(エレガントでない場合)方法を示しています。
一部の作業で「goto」のようなステートメントをpythonに追加することは技術的に実現可能です。 「dis」モジュールと「new」モジュールを使用します。どちらも、pythonバイトコードのスキャンと変更に非常に役立ちます。
実装の背後にある主なアイデアは、最初にコードのブロックに「goto」と「label」ステートメントを使用するようにマークすることです。 「goto」機能をマークするために、特別な「@goto」デコレーターが使用されます。 その後、これらの2つのステートメントについてそのコードをスキャンし、基になるバイトコードに必要な変更を適用します。 これはすべて、ソースコードのコンパイル時に発生します。
これが質問に答えることを願っています。
[ユーザー定義の例外][1]を使用して「goto」をエミュレートできます。
例:
似たものを探していました。
だから私のアプローチは、ブールを使用して、ループのネストされたものから抜け出すのを助けることでした:
今あります。 ゴト。
これはあなたが探しているものに役立つかもしれないと思います。
同じ答えが欲しかったし、「ゴト」を使いたくなかった。 そこで、次の例を使用しました(learnpythonthehardwayから)。
私には自分のやり方ができる。 別のpythonスクリプトを使用しています。
ループしたい場合:
file1.py
。
file2.py 。
file3.py 。
(注:この手法はPython 2.xバージョンでのみ機能します)。
前進ゴトの場合は、以下を追加できます。
ただし、これは単純なシナリオ(つまり、. これらをネストすると、混乱に陥ります)。
python goto相当の代わりに、コードのクイックテストに次の方法でbreakステートメントを使用します。 これは、構造化されたコードベースを持っていることを前提としています。 テスト変数は関数の開始時に初期化され、"を移動します。;テストの場合:break"。; テストしたいネストされたif-thenブロックまたはループの最後までブロックします。, コードの最後にある戻り変数を変更して、ブロックまたはループ変数I'を反映させます。;mテスト。
gotoステートメントを実装する代替方法はありません。
Python 2& 3。 --------。
リンク:goto-statement。
----------。
foo.py。