क्या goto
पायथन में कोई या कोई समकक्ष है जो कोड की एक विशिष्ट रेखा पर कूदने में सक्षम है?
goto
पायथन में अमल किया, जब वह कुछ फोरट्रान कोड का अनुवाद पायथन में कर रहा था। वह इसके लिए खुद से नफरत करता था।
क्या goto
पायथन में कोई या कोई समकक्ष है जो कोड की एक विशिष्ट रेखा पर कूदने में सक्षम है?
goto
पायथन में अमल किया, जब वह कुछ फोरट्रान कोड का अनुवाद पायथन में कर रहा था। वह इसके लिए खुद से नफरत करता था।
जवाबों:
पायथन आपको कुछ चीजों को करने की क्षमता प्रदान करता है जो आप प्रथम श्रेणी के कार्यों का उपयोग करके एक गोटो के साथ कर सकते हैं। उदाहरण के लिए:
void somefunc(int a)
{
if (a == 1)
goto label1;
if (a == 2)
goto label2;
label1:
...
label2:
...
}
अजगर इस तरह किया जा सकता है:
def func1():
...
def func2():
...
funcmap = {1 : func1, 2 : func2}
def somefunc(a):
funcmap[a]() #Ugly! But it works.
दी, कि गोटो के लिए सबसे अच्छा तरीका नहीं है। लेकिन यह जानने के बिना कि आप गोटो के साथ क्या करने की कोशिश कर रहे हैं, विशिष्ट सलाह देना कठिन है।
@ ascobol :
आपका सबसे अच्छा शर्त यह है कि इसे या तो किसी फ़ंक्शन में संलग्न करें या अपवाद का उपयोग करें। समारोह के लिए:
def loopfunc():
while 1:
while 1:
if condition:
return
अपवाद के लिए:
try:
while 1:
while 1:
raise BreakoutException #Not a real exception, invent your own
except BreakoutException:
pass
यदि आप किसी अन्य प्रोग्रामिंग भाषा से आते हैं तो इस तरह से सामान का उपयोग करना थोड़ा अजीब लग सकता है। लेकिन मेरा तर्क है कि यदि आप अपवादों का उपयोग करना पसंद करते हैं, तो पायथन आपके लिए भाषा नहीं है। :-)
loopfunc
आम तौर पर इनपुट की आवश्यकता होती है और लागू करने के लिए कुछ और प्रयास करने होते हैं, लेकिन मुझे लगता है कि ज्यादातर मामलों में यह सबसे अच्छा तरीका है।
मैंने हाल ही में एक फंक्शन डेकोरेटर लिखा हैgoto
जो पायथन में सक्षम बनाता है, जैसे:
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
मुझे यकीन नहीं है कि कोई ऐसा क्यों करना चाहेगा। उस ने कहा, मैं इसके बारे में बहुत गंभीर नहीं हूं। लेकिन मैं यह बताना चाहता हूं कि पायथन में इस तरह की मेटा प्रोग्रामिंग वास्तविक रूप से संभव है, कम से कम CPython और PyPy में, और न केवल डीबगर API का दुरुपयोग करके, जैसा कि दूसरे लड़के ने किया था। आपको हालांकि बायोटेक के साथ गड़बड़ करना होगा।
.begin
और .end
लेबल करता है?
मुझे यह आधिकारिक अजगर डिजाइन और इतिहास FAQ में मिला ।
कोई गोटो क्यों नहीं है?
आप "संरचित गोटो" प्रदान करने के लिए अपवादों का उपयोग कर सकते हैं जो फ़ंक्शन कॉल में भी काम करता है। कई लोग महसूस करते हैं कि अपवाद सी, फोरट्रान और अन्य भाषाओं के "गो" या "गोटो" निर्माणों के सभी उचित उपयोगों का आसानी से अनुकरण कर सकते हैं। उदाहरण के लिए:
class label(Exception): pass # declare a label
try:
...
if condition: raise label() # goto label
...
except label: # where to goto
pass
...
यह आपको लूप के बीच में कूदने की अनुमति नहीं देता है, लेकिन आमतौर पर इसे गोटो का दुरुपयोग माना जाता है। किफायत से इस्तेमाल करो।
यह बहुत अच्छा है कि आधिकारिक एफएक्यू में भी इसका उल्लेख किया गया है, और यह एक अच्छा समाधान नमूना प्रदान किया गया है। मैं वास्तव में अजगर को पसंद करता हूं क्योंकि उसका समुदाय goto
इस तरह से भी इलाज कर रहा है;)
goto
एक प्रमुख प्रोग्रामिंग फॉक्स पैस है, लेकिन यह सुनिश्चित करने के लिए कि आईएमओ का दुरुपयोग करने के अपवाद goto
केवल थोड़े बेहतर हैं और फिर भी उन पर भारी असर पड़ना चाहिए। मैं नहीं बल्कि पायथन रचनाकारों goto
को कुछ अवसरों के लिए भाषा में शामिल करना चाहिए जहां यह वास्तव में इसे अस्वीकार करने की तुलना में उपयोगी है क्योंकि "यह बुरा है, दोस्तों" और फिर समान कार्यक्षमता (और समान कोड स्पैगेट्रीफिकेशन) प्राप्त करने के लिए अपवादों का दुरुपयोग करने की सलाह देते हैं।
टिप्पणियों से सुझाव का उपयोग करते हुए @ascobol
प्रश्न का उत्तर देने के लिए @bobince
:
for i in range(5000):
for j in range(3000):
if should_terminate_the_loop:
break
else:
continue # no break encountered
break
else
ब्लॉक के लिए इंडेंट सही है। कोड else
लूप पायथन सिंटैक्स के बाद अस्पष्ट का उपयोग करता है । देखें कि छोरों के लिए अजगर 'और ’का उपयोग क्यों करता है?
else
निष्पादित किया गया है यदि break
सामना नहीं किया गया है। प्रभाव यह है कि आंतरिक और बाहरी दोनों छोरों को should_terminate_the_loop
समाप्त करता है।
return
@ जैसन बेकर द्वारा सुझाया गया , गहरी नेस्टेड छोरों को तोड़ने का एक अच्छा विकल्प है।
एक कार्यशील संस्करण बनाया गया है: http://entrian.com/goto/ ।
नोट: इसे अप्रैल फूल के मजाक के रूप में पेश किया गया था। (हालांकि काम कर)
# 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"
कहने की आवश्यकता नहीं। हाँ, यह मज़ेदार है, लेकिन इसका उपयोग न करें।
2007 में PEP 3136 के लिए लेबल break
और continue
प्रस्तावित किए गए थे , लेकिन इसे अस्वीकार कर दिया गया था। प्रस्ताव का प्रेरणा अनुभाग पायथन में लेबल की नकल के लिए कई सामान्य (यदि अयोग्य हो) तरीकों को दिखाता है ।break
यह तकनीकी रूप से संभव है कि कुछ कार्यों के साथ अजगर को 'गोटो' जैसा बयान दिया जाए। हम "डिस" और "नए" मॉड्यूल का उपयोग करेंगे, दोनों अजगर बाइट कोड को स्कैन और संशोधित करने के लिए बहुत उपयोगी हैं।
कार्यान्वयन के पीछे मुख्य विचार पहले कोड के एक ब्लॉक को "गोटो" और "लेबल" स्टेटमेंट का उपयोग करके चिह्नित करना है। "गोटो" कार्यों को चिह्नित करने के उद्देश्य से एक विशेष "@गो" डेकोरेटर का उपयोग किया जाएगा। बाद में हम इन कोड को इन दो कथनों के लिए स्कैन करते हैं और अंतर्निहित बाइट कोड के लिए आवश्यक संशोधन लागू करते हैं। यह सब स्रोत कोड संकलन समय पर होता है।
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()
आशा है कि यह प्रश्न का उत्तर देगा।
आप अनुकरण करने के लिए उपयोगकर्ता-परिभाषित अपवाद का उपयोग कर सकते हैंgoto
उदाहरण:
class goto1(Exception):
pass
class goto2(Exception):
pass
class goto3(Exception):
pass
def loop():
print 'start'
num = input()
try:
if num<=0:
raise goto1
elif num<=2:
raise goto2
elif num<=4:
raise goto3
elif num<=6:
raise goto1
else:
print 'end'
return 0
except goto1 as e:
print 'goto1'
loop()
except goto2 as e:
print 'goto2'
loop()
except goto3 as e:
print 'goto3'
loop()
pip3 install goto-statement
3.6 और PyPy के माध्यम से पायथन 2.6 पर परीक्षण किया गया।
लिंक: गोटो-स्टेटमेंट
foo.py
from goto import with_goto
@with_goto
def bar():
label .bar_begin
...
goto .bar_begin
मैं कुछ इसी तरह की चीज की तलाश में था
for a in xrange(1,10):
A_LOOP
for b in xrange(1,5):
for c in xrange(1,5):
for d in xrange(1,5):
# do some stuff
if(condition(e)):
goto B_LOOP;
तो मेरा दृष्टिकोण छोरों के लिए घोंसले से बाहर निकलने में मदद करने के लिए एक बूलियन का उपयोग करना था:
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
वहां है अभी। के लिए जाओ
मुझे लगता है कि यह आपके लिए उपयोगी हो सकता है।
मैं एक ही जवाब चाहता था और मैं उपयोग नहीं करना चाहता था goto
। इसलिए मैंने निम्नलिखित उदाहरण का उपयोग किया (learnpythonthehardway से)
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)
मेरे पास गोट्स करने का अपना तरीका है। मैं अलग अजगर लिपियों का उपयोग करता हूं।
अगर मुझे लूप चाहिए:
file1.py
print("test test")
execfile("file2.py")
a = a + 1
file2.py
print(a)
if a == 10:
execfile("file3.py")
else:
execfile("file1.py")
file3.py
print(a + " equals 10")
( नोट: यह तकनीक केवल पायथन 2.x संस्करणों पर काम करती है)
एक अजगर गोटो समतुल्य के बदले में मैं अपने कोड के त्वरित परीक्षणों के लिए निम्नलिखित कथन में ब्रेक स्टेटमेंट का उपयोग करता हूं। यह मानता है कि आपके पास संरचित कोड आधार है। परीक्षण चर को आपके फ़ंक्शन के प्रारंभ में आरंभीकृत किया जाता है और मैं अभी "नेड टेस्ट: ब्रेक" ब्लॉक को नेस्टेड के अंत में ब्लॉक करता हूं अगर-तब ब्लॉक या लूप जिसे मैं परीक्षण करना चाहता हूं, कोड के अंत में रिटर्न चर को संशोधित करना मैं परीक्षण कर रहा हूँ ब्लॉक या लूप चर को प्रतिबिंबित करने के लिए।
def x:
test = True
If y:
# some code
If test:
break
return something
हालांकि goto/label
पायथन में कोई भी कोड समान नहीं है , फिर भी आप goto/label
लूप का उपयोग करने की ऐसी कार्यक्षमता प्राप्त कर सकते हैं ।
नीचे दिखाए गए कोड का नमूना लेते हैं जहां goto/label
अजगर के अलावा किसी अन्य भाषा में इस्तेमाल किया जा सकता है।
String str1 = 'BACK'
label1:
print('Hello, this program contains goto code\n')
print('Now type BACK if you want the program to go back to the above line of code. Or press the ENTER key if you want the program to continue with further lines of code')
str1 = input()
if str1 == 'BACK'
{
GoTo label1
}
print('Program will continue\nBla bla bla...\nBla bla bla...\nBla bla bla...')
अब उपरोक्त कोड नमूने की समान कार्यक्षमता while
नीचे दिखाए गए लूप का उपयोग करके अजगर में प्राप्त की जा सकती है ।
str1 = 'BACK'
while str1 == 'BACK':
print('Hello, this is a python program containing python equivalent code for goto code\n')
print('Now type BACK if you want the program to go back to the above line of code. Or press the ENTER key if you want the program to continue with further lines of code')
str1 = input()
print('Program will continue\nBla bla bla...\nBla bla bla...\nBla bla bla...')
नहीं, गोटो स्टेटमेंट को लागू करने का कोई वैकल्पिक तरीका नहीं है
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()