পাইথনে কোনও লেবেল / গোটো আছে?


178

gotoপাইথনে একটি নির্দিষ্ট কোডের লিংকে যেতে সক্ষম হতে কোনও সমমান আছে কি ?


2
লেবেলটি বেশ অস্পষ্ট - আপনি যা খুঁজছেন সে সম্পর্কে আপনি আরও নির্দিষ্ট হতে পারেন?
দানা


9
আমার এক বন্ধু gotoপাইথনে বাস্তবায়ন করেছিল যখন সে পাইথনে কিছু ফোর্টরান কোড অনুবাদ করছিল। সে এর জন্য নিজেকে ঘৃণা করেছিল।
কোডি পিয়ার্সাল

3
github.com/cdjc/goto (এটি এন্ট্রিয়ান বাস্তবায়নের চেয়ে অনেক দ্রুত)
সিডিজেসি

"লেবেলটি বেশ অস্পষ্ট", কোনও লেবেল বুদ্ধিমান নয়, কাঠামোগত একটি মেশিনের মতো কাজ করছে
ডাটদিনহোকোক

উত্তর:


118

না, পাইথন লেবেল এবং গোটো সমর্থন করে না, যদি এটি পরে থাকে। এটি একটি (অত্যন্ত) কাঠামোগত প্রোগ্রামিং ভাষা।


36
@ রেজিনাকম ফাংশন?
আনঙ্কউনটেক

79

পাইথন আপনাকে প্রথম শ্রেণীর ফাংশন ব্যবহার করে গোটো দিয়ে কিছু করতে পারে এমন কিছু করার সুযোগ দেয়। উদাহরণ স্বরূপ:

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.

মঞ্জুর, এটি গোটোর বিকল্পের সেরা উপায় নয়। তবে আপনি গোটোটির সাথে ঠিক কী করার চেষ্টা করছেন তা না জেনে নির্দিষ্ট পরামর্শ দেওয়া শক্ত।

@ অ্যাসকোবল :

আপনার সেরা বেট হয় হয় এটি কোনও ফাংশনে আবদ্ধ করা বা একটি ব্যতিক্রম ব্যবহার করা। ফাংশনের জন্য:

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সাধারণত ইনপুটগুলি প্রয়োগ করতে এবং আরও কিছু প্রচেষ্টা প্রয়োজন হবে, তবে বেশিরভাগ ক্ষেত্রে এটি আমার মনে হয় সেরা উপায়।
কন সাইক

60

আমি সম্প্রতি একটি ফাংশন সাজসজ্জা লিখেছি যা 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

আমি নিশ্চিত না কেন কেউ কেন এমন কিছু করতে চান। বলেছিল, আমি এ নিয়ে খুব বেশি সিরিয়াস নই। তবে আমি এটি উল্লেখ করতে চাই যে এই ধরণের মেটা প্রোগ্রামিং পাইথন, কমপক্ষে সিপিথন এবং পাইপাইতে সত্যই সম্ভব এবং কেবলমাত্র অন্য লোকের মতোই ডিবাগার এপিআই ব্যবহার না করেই সম্ভব। যদিও আপনাকে বাইকোডের সাথে ঝামেলা করতে হবে।


3
দুর্দান্ত সাজসজ্জা আপনার তৈরি! কীভাবে আপনি বাইটকোডের সাথে
ঝাঁকুনি

আমি মনে করি, এই প্রশ্নের এই গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি অনেক নেস্টেড লুপগুলির জন্য দরকারী হতে পারে, কেন নয়?
পাইম্যাথলিঙ্গেজয়েজ

এটি কি কেবল সমর্থন করে .beginএবং .endলেবেলগুলি?
আলেকজ মাগুরা

29

আমি এটি সরকারী পাইথন ডিজাইন এবং ইতিহাস FAQ এ পেয়েছি ।

কেন সেখানে গোটো নেই?

আপনি "স্ট্রাকচার্ড গোটো" সরবরাহ করতে ব্যতিক্রমগুলি ব্যবহার করতে পারেন যা এমনকি ফাংশন কলগুলিতে কাজ করে। অনেকে মনে করেন যে ব্যতিক্রমগুলি সুবিধামত সি, ফোর্টরান এবং অন্যান্য ভাষার "গো" বা "গোটো" রচনাগুলির সমস্ত যুক্তিসঙ্গত ব্যবহারগুলি অনুকরণ করতে পারে। উদাহরণ স্বরূপ:

class label(Exception): pass  # declare a label

try:
    ...
    if condition: raise label()  # goto label
    ...
except label:  # where to goto
    pass
... 

এটি আপনাকে কোনও লুপের মাঝখানে ঝাঁপতে দেয় না, তবে এটি সাধারণত যাইহোক গোটোর অপব্যবহার হিসাবে বিবেচিত হয়। সতর্কতার সাথে অল্পকরে ব্যবহার করা.

এটি খুব সুন্দর যে এটি এমনকি সরকারী FAQ এ উল্লেখ করা হয়েছে, এবং একটি দুর্দান্ত সমাধানের নমুনা সরবরাহ করা হয়েছে। আমি সত্যিই অজগর পছন্দ করি কারণ এর সম্প্রদায়টিও gotoএরকম আচরণ করে ;)


1
আপত্তিজনক gotoবিষয়টি নিশ্চিত হওয়ার জন্য একটি প্রধান প্রোগ্রামিং ফাউস পাস, তবে আইএমও অপব্যবহারের ব্যতিক্রমগুলি অনুকরণ gotoকরতে কেবল কিছুটা ভাল এবং তারপরেও এটি ভারী হওয়া উচিত। আমি বরং পাইথন স্রষ্টাদের gotoভাষাগুলিতে এমন কয়েকটি অনুষ্ঠানের জন্য অন্তর্ভুক্ত করতাম যেখানে এটি আসলে এটিকে অস্বীকার করার চেয়ে কার্যকরী কারণ "" এটি খারাপ, লোক "এবং তারপরে একই কার্যকারিতা (এবং একই কোড স্প্যাগিটিফিকেশন) পেতে ব্যতিক্রমগুলি অবমাননার পরামর্শ দিন।
অ্যাবিয়ন 47

15

মন্তব্যগুলি থেকে পরামর্শের পরামর্শ ব্যবহার করে @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লুপ পাইথন সিনট্যাক্সের পরে অস্পষ্ট ব্যবহার করে। দেখুন অজগর লুপগুলির পরে এবং কেন 'অন্য' ব্যবহার করে?


আমি আপনার অন্য ব্লক ইনডেন্টটি স্থির করেছি, যা একটি আকর্ষণীয় আবিষ্কারের দিকে পরিচালিত করেছে :
ব্র্যাডেন বেস্ট

3
@ বি 1 কে মিউজিক: ইনডেন্টটি ঠিক আছে। এটি একটি বিশেষ পাইথন সিনট্যাক্স। লুপের পরে মৃত্যুর মুখোমুখি না হলে elseকার্যকর করা হয়break । প্রভাবটি হ'ল অভ্যন্তরীণ এবং বাইরের উভয় লুপগুলি should_terminate_the_loopসমাপ্ত করে
jfs

1
আমার উল্লেখ করা উচিত ছিল যে আমি সম্পাদনা করার পরে কেবল সেই আবিষ্কারটি করেছি। তার আগে, আমি ভেবেছিলাম যে আমি দোভাষীর মধ্যে একটি বাগ আবিষ্কার করেছি, তাই আমি পরীক্ষাগুলির একটি গুচ্ছ তৈরি করেছি এবং কী চলছে তা বোঝার জন্য কিছু গবেষণা করেছি । এর জন্যে দুঃখিত.
ব্র্যাডেন সেরা

1
এখন আমি বুঝতে পারছি যে কি চলছে, আমি সম্মত হলাম, এটি এমন কিছু রহস্যজনক কোড যা আরও প্রচলিত পদ্ধতিতে
ব্র্যাডেন বেস্ট

1
@ বি 1 কে মিউজিক: না your আপনার অজ্ঞতার ভিত্তিতে ডুপ্লিকেট কোড কোনও ভাল সমাধান নয়। হ্যাঁ. return @ জেসন বেকার দ্বারা পরামর্শ দেওয়া গভীরভাবে নেস্ট করা লুপগুলি ভেঙে ফেলার জন্য একটি ভাল বিকল্প।
jfs

12

একটি কার্যকরী সংস্করণ তৈরি করা হয়েছে: 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"

বলা বাহুল্য. হ্যাঁ এটি মজার, তবে এটি ব্যবহার করবেন না।


1
3 ব্রেক ব্যবহারের চেয়ে আমার কাছে আরও ভাল লাগছে ... অবশ্যই এটি লেখার অন্যান্য উপায়ও রয়েছে।
নিক

1
@ রিটার্ন সহ ফাংশনের নিক ব্যবহার আরও বেশি ভাল দেখায়।
এরিক Šťastný

7

জন্য লেবেল breakএবং continueএ প্রস্তাব করা হয়েছে PEP 3136 2007 ফিরে, কিন্তু এটা বাতিল করা হয়েছে। প্রেরণা প্রস্তাবের অধ্যায় বিভিন্ন সাধারণ (যদি অসুন্দর) লেবেল অনুকরণ করার পদ্ধতি প্রকাশ করে breakপাইথন হবে।


7

টেকনিক্যালি কিছু কাজ দিয়ে অজগরকে 'গোটো' মতো স্টেটমেন্ট যুক্ত করা সম্ভব। পাইথন বাইট কোড স্ক্যান এবং সংশোধন করার জন্য আমরা উভয়ই "ডিস" এবং "নতুন" মডিউলগুলি ব্যবহার করব।

বাস্তবায়নের পিছনে মূল ধারণাটি হ'ল "গোটো" এবং "লেবেল" বিবৃতি ব্যবহার করে কোডের একটি ব্লক চিহ্নিত করা। "গোটো" ফাংশনগুলি চিহ্নিত করার উদ্দেশ্যে একটি বিশেষ "@ গোটো" ডেকরেটার ব্যবহার করা হবে। এর পরে আমরা এই দুটি স্টেটমেন্টের জন্য সেই কোডটি স্ক্যান করি এবং অন্তর্নিহিত বাইট কোডে প্রয়োজনীয় পরিবর্তনগুলি প্রয়োগ করি। উত্স কোডটি সংকলনের সময় এই সমস্ত ঘটে।

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

এই প্রশ্নের উত্তর আশা করি।


5

আপনি অনুকরণ করতে ব্যবহারকারী-সংজ্ঞায়িত ব্যতিক্রমগুলি ব্যবহার করতে পারেন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()

জট্টিল পদ্ধতি কিন্তু আমরা Str ব্যতিক্রম মি পদ্ধতি নিঃশব্দ করতে পারেন
বেনামী

@ নামবিহীন কোন ব্যতিক্রম? আপনি পাইথন 3 ব্যবহার করেন?
xavierskip


3

আমি অনুরূপ কিছু খুঁজছিলাম

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

2

সেখানে এখন. যাও

আমি মনে করি আপনি যা সন্ধান করছেন এটির জন্য এটি কার্যকর হতে পারে।


1

আমি একই উত্তর চেয়েছিলাম এবং আমি ব্যবহার করতে চাই না goto। সুতরাং আমি নিম্নলিখিত উদাহরণটি ব্যবহার করেছি

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)

1

গোটোস করার আমার নিজস্ব পদ্ধতি রয়েছে। আমি পৃথক পাইথন স্ক্রিপ্ট ব্যবহার করি।

যদি আমি লুপ করতে চাই:

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

( দ্রষ্টব্য: এই কৌশলটি কেবল পাইথন ২.x সংস্করণে কাজ করে)


1

একটি ফরোয়ার্ড গোটোর জন্য, আপনি কেবল যোগ করতে পারেন:

while True:
  if some condition:
    break
  #... extra code
  break # force code to exit. Needed at end of while loop
#... continues here

এটি কেবলমাত্র সাধারণ দৃশ্যের জন্য সহায়তা করে (যদিও এগুলি বাসা বাঁধলে আপনি কোনও গোলমেলে পড়বেন)


1

পাইথন গোটো সমতুল্য হওয়ার পরিবর্তে আমি আমার কোডের দ্রুত পরীক্ষার জন্য নিম্নলিখিত ফ্যাশনে ব্রেক স্টেটমেন্ট ব্যবহার করি। এটি ধরে নিয়েছে যে আপনার কাঠামোগত কোড বেস রয়েছে। পরীক্ষার ভেরিয়েবলটি আপনার ফাংশনটির শুরুতে আরম্ভ করা হয় এবং আমি কেবল "যদি পরীক্ষা: বিরতি" ব্লকটি নেস্টেডের শেষে সরিয়ে নিয়ে যাই তবে-পরে ব্লক বা লুপ আমি পরীক্ষা করতে চাই, কোডের শেষে রিটার্ন ভেরিয়েবলটি পরিবর্তন করে আমি পরীক্ষা করছি ব্লক বা লুপ ভেরিয়েবল প্রতিফলিত করতে।

def x:
  test = True
  If y:
     # some code
     If test:
            break
  return something

1

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

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()  
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.