কীভাবে ক্লজ থেকে প্রস্থান করবেন


108

অবিচ্ছেদ্যভাবে একটি ifধারা ছেড়ে দেওয়ার জন্য কী ধরণের পদ্ধতি বিদ্যমান ?

এমন সময় আছে যখন আমি কোড লিখছি এবং breakএকটি ifঅনুচ্ছেদের ভিতরে একটি বিবৃতি রাখতে চাই, কেবল মনে রাখতে হবে সেগুলি কেবল লুপের জন্য ব্যবহার করা যেতে পারে।

নীচের কোডটি উদাহরণ হিসাবে নেওয়া যাক:

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   ...
   if condition_b:
       # do something
       # and then exit the outer if block
   # more code here

আমি এটি করার একটি উপায় সম্পর্কে ভাবতে পারি: ধরে নেওয়া বাহ্যিক ক্ষেত্রে প্রস্থানের ঘটনাগুলি ঘটে থাকে তা ধরে নেওয়া যদি বাকী বিবরণী থাকে তবে অবশিষ্ট কোডটি অন্য কোনও বড় ব্লকে মোড়কে রাখুন। উদাহরণ:

if some_condition:
   ...
   if condition_a:
       # do something
       # and then exit the outer if block
   else:
       ...
       if condition_b:
           # do something
           # and then exit the outer if block
       else:
           # more code here

এটির সাথে সমস্যাটি হ'ল আরও বেশি প্রস্থান অবস্থানের অর্থ আরও বাসা বা ইন্টেন্টেড কোড।

বিকল্পভাবে, আমি ifক্লজগুলি যথাসম্ভব ছোট হতে এবং কোনও প্রস্থান ছাড়ার প্রয়োজন নেই বলে আমার কোডটি লিখতে পারি ।

কেউ কি ifক্লজ থেকে বেরিয়ে আসার ভাল / আরও ভাল উপায় সম্পর্কে জানেন ?

যদি অন্য কোনও যুক্ত থাকে-যদি এবং অন্য ধারা থাকে তবে আমি অনুমান করি যে প্রস্থানটি এগুলি এড়িয়ে যাবে।


4
আপনার দ্বিতীয় কোডের নমুনার জন্য - আপনি কি জানেন elif?
ক্রেগ ম্যাককুইন

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

4
@ ক্রেইগ ম্যাককুইন: আমি করি, তবে বলি শর্ত বিবরণের মধ্যে আমি কোড সম্পাদন করতে চাই? উদাহরণস্বরূপ if a: #stuff; #stuff_inbetween; if b: #stuff;অভ্যন্তরীণ কোড নির্ভর করে not aতবে নির্ভর করে না b
রোমান

হ্যালো ভুলবেন না দয়া করে elif stackoverflow.com/a/2069680/7045119
kerbrose

উত্তর:


104

(এই পদ্ধতিটি ifগুলি, একাধিক নেস্টেড লুপ এবং অন্যান্য নির্মাণের জন্য কাজ করে যা আপনি breakসহজেই পারবেন না ))

কোডটিকে তার নিজস্ব কার্যক্রমে মোড়ানো। পরিবর্তে break, ব্যবহার করুন return

উদাহরণ:

def some_function():
    if condition_a:
        # do something and return early
        ...
        return
    ...
    if condition_b:
        # do something else and return early
        ...
        return
    ...
    return

if outer_condition:
    ...
    some_function()
    ...

4
আমি আপনার ব্যাগ প্রোগ্রামার ট্রিকগুলিতে যুক্ত হতে পেরে খুশি। আমার অভিজ্ঞতায়, আপনি যখন একজন এগিয়ে-চলমান গোটো ব্যবহার করার জন্য প্রলুব্ধ হন তখন প্রায় প্রতিটি সময়ই এই পদ্ধতির কাজ করে। (এবং এটি উভয়ই ইঙ্গিত দেয় এবং এমন পরিস্থিতিতেও সম্বোধন করে যেখানে একটি একক ফাংশন খুব বেশি বড় হচ্ছে)
ড্রু ডোরম্যান

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

18
একটি পুরাতন উপাখ্যান আছে: "ডেনিস রিচি সকলকে জানিয়ে এবং মডেলারিটিকে উত্সাহিত করেছিলেন যে ফাংশন কলগুলি সত্যিকার অর্থেই সস্তা সি C. , এবং ভ্যাক্স কোড প্রায়শই কলগুলির নির্দেশে তার 50% সময় ব্যয় করত Den ডেনিস আমাদের সাথে মিথ্যা বলেছিল! তবে অনেক দেরি হয়ে গেছে; আমরা সবাইকে আটকানো হয়েছিল ... "
সংক্ষিপ্ত

4
@ ফেমিয়েন্ট: এটি মজার, গল্পের কী আরও কিছু আছে? আমি পুরো জিনিসটি পড়তে চাই
রোমান

4
এই উদ্ধৃতিটি দ্য আর্ট অফ ইউনিক্স প্রোগ্রামিং বইয়ের ৪ য় অধ্যায় থেকে পাওয়া গেছে (অনলাইনে ফ্যাক্স.আর । / ডকস / আর্টু )। আপনার সত্যিই পুরো জিনিসটি পড়া উচিত, যদি আপনার আগে না থাকে।
মুহুর্তের

57
থেকে এতে যান আমদানি এতে যান, লেবেল

যদি কিছু_শর্ত:
   ...
   যদি শর্ত_আ:
       # কিছু কর
       # এবং তারপরে যদি ব্লক হয় তবে বাইরে থেকে প্রস্থান করুন
       যাও .end
   ...
   যদি শর্ত_ বি:
       # কিছু কর
       # এবং তারপরে যদি ব্লক হয় তবে বাইরে থেকে প্রস্থান করুন
       যাও .end
   # আরও কোড এখানে

লেবেল .end

(আসলে এটি ব্যবহার করবেন না, দয়া করে।)


38
+1 কারণ এটি মজার। একটি গুগল অনুসন্ধান আমাকে প্রকাশ করেছিল যে এটি একটি এপ্রিল ফুলের রসিকতা মডিউল।
রোমান

4
আমিও এর সাথে যুক্ত হয়েছি। প্রথম ক্লিক করুন goto
মুহুর্তের

4
এটি আমাকে সমস্ত ধরণের শাখাগুলির সাথে সমাবেশ কোডের কথা মনে করিয়ে দেয় :)
ফুনেহে

4
@ ফেমিয়েন্ট: আহ, লিঙ্কটি লক্ষ্য করেনি। অঙ্কিত এটি কোড হাইলাইটিং ছিল। তবে এখন আমি আপনার কোডটি দেখছি, এমন কোনও বাস্তব হাইলাইট আমি দেখতে পাচ্ছি না ..
রোমান

4
পিএইচপি যখন গেটো
মার্চ

25
while some_condition:
   ...
   if condition_a:
       # do something
       break
   ...
   if condition_b:
       # do something
       break
   # more code here
   break

4
ওহ, আমি এই ধারণাটি সত্যিই পছন্দ করি like আমি মনে করি এটি ঠিক আমার আসল ইচ্ছাকে সমাধান করে sol যাইহোক, আমার এক উত্তেজনাপূর্ণ অনুভূতি আছে যে এটি ভাল অনুশীলন নয় (এবং সেই কারণেই, আমি বর্তমানের বর্তমান গৃহীত উত্তরটি ধরে রাখব কারণ এটি ভাল কোডিং শৈলীর প্রচার করে)।
রোমান

6
নোট করুন যে আপনি যদি আসলটি রাখতে পারেন এবং পুরো জিনিসটি একটিতে মুড়ে ফেলতে পারেন while True:breakশেষ পর্যন্ত কোনও বিবৃতি দেওয়ার জন্য নিশ্চিত করুন ! করণীয় নির্মাণের সাথে ভাষাগুলি করার জন্য এটি করা আরও মূর্তিমানিক:do { code that can conditionally break out } while (false);
টমাস এডিং

10

আপনি ব্যতিক্রমগুলি সহ গোটোর কার্যকারিতা অনুকরণ করতে পারেন:

try:
    # blah, blah ...
    # raise MyFunkyException as soon as you want out
except MyFunkyException:
    pass

দাবি অস্বীকার: আমি কেবল এইভাবে কাজগুলি করার সম্ভাবনাটি আপনার নজরে আনার অর্থ করছি , যদিও কোনও পরিস্থিতিতে আমি এটিকে সাধারণ পরিস্থিতিতে যুক্তিসঙ্গত হিসাবে সমর্থন করি না। যেহেতু আমি প্রশ্নের একটি মন্তব্যে উল্লেখ করেছি, কাঠামোগত কোড যাতে বাইজেন্টাইন কন্ডিশনালগুলি প্রথম স্থানে এড়ানো যায় ততদূর মাধ্যমে পছন্দনীয়। :-)


হাহাহা, আমি এই সৃজনশীল সমাধানটি পছন্দ করি। যদিও আমি আপনার দাবি অস্বীকার করি এবং এই জাতীয় মজাদার কোড ব্যবহার করব না।
রোমান

@ রোমান: শ্রোম্পটির পাশাপাশি আরও একটি কৌশল যুক্ত করতে পেরে খুশি - এমনকি যখন আমি তুলনায় দুষ্টু বোধ করি। ;-)
মিচা মারকিজিক

8

হয়তো এই?

if some_condition and condition_a:
       # do something
elif some_condition and condition_b:
           # do something
           # and then exit the outer if block
elif some_condition and not condition_b:
           # more code here
else:
     #blah
if

4
হ্যাঁ, এটা কাজ করতে পারে। আমি মনে করি elifআমি এটি লিখতে গিয়ে আমার মনের ধরণটি ফাঁকা হয়ে গেল। যদিও আমি মনে করি এটি এমন পরিস্থিতিতে কাজ করবে না যেখানে আমি বিবৃতিতে যদি নীড়ের মধ্যে কোড সম্পাদন করতে চাই।
রোমান

এটি আসলে সঠিক উত্তর। আমি কেন লোকেরা এটি সুপারিশ করতে দেখছি না ?? :)
কার্বরোজ

7

আসলে যা জিজ্ঞাসা করা হয়েছিল তার জন্য, আমার পন্থাটি হ'ল ifএগুলি একটি এক-লুপযুক্ত লুপের ভিতরে রাখা

while (True):
    if (some_condition):
        ...
        if (condition_a):
            # do something
            # and then exit the outer if block
            break
        ...
        if (condition_b):
            # do something
            # and then exit the outer if block
            break
        # more code here
    # make sure it is looped once
    break

এটা পরীক্ষা করো:

conditions = [True,False]
some_condition = True

for condition_a in conditions:
    for condition_b in conditions:
        print("\n")
        print("with condition_a", condition_a)
        print("with condition_b", condition_b)
        while (True):
            if (some_condition):
                print("checkpoint 1")
                if (condition_a):
                    # do something
                    # and then exit the outer if block
                    print("checkpoint 2")
                    break
                print ("checkpoint 3")
                if (condition_b):
                    # do something
                    # and then exit the outer if block
                    print("checkpoint 4")
                    break
                print ("checkpoint 5")
                # more code here
            # make sure it is looped once
            break

4
সত্যি কথা বলতে কি, এটিই সবচেয়ে পরিষ্কার সমাধান। কোডটি প্রস্থান করার সময় এটি খুব স্পষ্ট - আপনার ফাংশনগুলির ভিতরে ফাংশন স্কোপিংয়ের বিষয়ে চিন্তা করতে হবে না এবং শূন্য কার্য সম্পাদন বা যৌক্তিক debtণ রয়েছে।
ট্রেন্ট

4
for _ in range(1):পরিবর্তে ব্যবহার বিবেচনা করতে পারে while True:। (1) একক পুনরাবৃত্তি লুপের বিষয়ে আপনার উদ্দেশ্য সম্পর্কে ভাল কথা বলা এবং (২) লুপটি থেকে বেরিয়ে আসার কোনও শেষ ব্রেক স্টেটমেন্ট নেই (পরে দুর্ঘটনার ফলে মুছে ফেলা হতে পারে)
বার্নহার্ড কাউসার

3

সাধারনভাবে বলছি, করবেন না। আপনি যদি "ifs" বাসা বাঁধছেন এবং সেগুলি থেকে বিরতি দিচ্ছেন, আপনি এটি ভুল করছেন।

তবে, আপনার যদি অবশ্যই:

if condition_a:
   def condition_a_fun():
       do_stuff()
       if we_wanna_escape:
           return
   condition_a_fun()
if condition_b:
   def condition_b_fun():
       do_more_stuff()
       if we_wanna_get_out_again:
           return
   condition_b_fun()

দ্রষ্টব্য, যদি বিবৃতিতে ফাংশনগুলি ঘোষণা করা হয় না, তবে তাদের অগ্রিম ঘোষণা করা যেতে পারে;) এটি আরও ভাল পছন্দ হবে, যেহেতু পরে / পরে এটি একটি কুৎসিত প্রতিস্থাপনের প্রয়োজন এড়াবে।


উত্তর করার জন্য ধন্যবাদ. 'নেস্টিং লুপস' বলতে আপনার অর্থ কী তা আমি নিশ্চিত নই। আপনি যদি 'ব্রেক' কীওয়ার্ডটি সম্পর্কে আমার উল্লেখ করে যাচ্ছেন, আমি লুপ প্রস্থানটির অস্তিত্বের সাথে তুলনা করে কেবল আমার অনুসন্ধানটি if-প্রস্থানের জন্য প্রেরণা দেওয়ার চেষ্টা করছিলাম। এছাড়াও, আমি নিশ্চিত নই কিভাবে আপনার কোড সমস্যা solves, যেমন আমার উদাহরণ ছিল if condition_aএবং if condition_bএকটি ভিতরে নেস্টেড if some_condition। আমি এর বাইরে ভাঙ্গতে সক্ষম হতে চাই if some_condition
রোমান

লোকেরা যদি আইএসএফ বাসা বাঁধতে চায় এবং এগুলি ভাঙার কারণ সম্ভবত এটি ভুল করা হয় তা নয়, তবে সম্ভবত তারা পরিষ্কার সহজ এবং ডিআরওয়াই কোড লিখতে চায়। সাধারণ ক্ষেত্রে হ'ল যখন কন্ডিশন_এ এবং কন্ডিশন_বি উভয় পরিপূর্ণ হয় যখন প্রোগ্রামটি এক্স () করতে হয় এবং কেবল কন্ডিশন_এর জন্য y () করতে হয় এবং কেবল শর্ত_ বি এর জন্য জেড () করতে হয়। এবং কোডার x () একাধিক সময় লিখতে প্রত্যাখ্যান করেছে
izzulmakin

1

কার্যকরভাবে আপনি যা বর্ণনা করছেন তা হ'ল গোটো স্টেটমেন্ট, যা সাধারণত বেশ ভারীভাবে প্যান করা হয়। আপনার দ্বিতীয় উদাহরণটি বোঝা অনেক সহজ।

যাইহোক, ক্লিনার এখনও হবে:

if some_condition:
   ...
   if condition_a:
       your_function1()
   else:
       your_function2()

...

def your_function2():
   if condition_b:
       # do something
       # and then exit the outer if block
   else:
       # more code here

1

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

if some_condition:
   ...
   if condition_a:
       # do something
       exit_if=True # and then exit the outer if block
if some condition and not exit_if: # if and only if exit_if wasn't set we want to execute the following code
   # keep doing something
   if condition_b:
       # do something
       exit_if=True # and then exit the outer if block
if some condition and not exit_if:
   # keep doing something

হ্যাঁ, এটি পঠনযোগ্যতার জন্য দ্বিতীয় চেহারাও প্রয়োজন, তবে কোডের স্নিপেটগুলি যদি ছোট হয় তবে লুপগুলি কখনই পুনরাবৃত্তি হবে না এবং মধ্যবর্তী ifs কী জন্য তা বোঝার পরে এটি কোনও ট্র্যাক করার প্রয়োজন হয় না, এটি সহজেই পাঠযোগ্য এক জায়গা এবং একই ইন্ডেন্টেশন সহ।

এবং এটি বেশ দক্ষ হওয়া উচিত।


0

সুতরাং আমি এখানে বুঝতে পারি আপনি কোড ব্লক করে বাইরের বাইরে বেরোনোর ​​চেষ্টা করছেন

if some_condition:
    ...
    if condition_a:
       # do something
       # and then exit the outer if block
       ...
    if condition_b:
       # do something
       # and then exit the outer if block
# more code here

এর একটি উপায় হ'ল আপনি যদি বাইরের ব্লকের কোনও মিথ্যা শর্তের জন্য পরীক্ষা করতে পারেন যা কোড ব্লক থেকে স্পষ্টতই প্রস্থান করবে, আপনি অন্য আইএফএসকে কিছু করার জন্য নীড়ের জন্য অন্য একটি ব্লক ব্যবহার করবেন

if test_for_false:
    # Exit the code(which is the outer if code)

else:
    if condition_a:
        # Do something

    if condition_b:
        # Do something

0

অতিরিক্ত পদ্ধতি ছাড়াই এটি প্রয়োগ করতে পারে elifকেবলমাত্র নীচের উদাহরণ হিসাবে

a = ['yearly', 'monthly', 'quartly', 'semiannual', 'monthly', 'quartly', 'semiannual', 'yearly']
# start the condition
if 'monthly' in b: 
    print('monthly') 
elif 'quartly' in b: 
    print('quartly') 
elif 'semiannual' in b: 
    print('semiannual') 
elif 'yearly' in b: 
    print('yearly') 
else: 
    print('final') 

-1

এটি পরিচালনা করার আরেকটি উপায় এখানে। এটি লুপের জন্য একটি একক আইটেম ব্যবহার করে যা আপনাকে কেবল চালিয়ে যাওয়া ব্যবহার করতে সক্ষম করে। এটি অকারণে অতিরিক্ত ক্রিয়াকলাপের অপ্রয়োজনীয় প্রয়োজনীয়তা রোধ করে। এবং লুপগুলি চলাকালীন সম্ভাব্য অসীমতাও দূর করে।

if something:
    for _ in [0]:
        # Get x
        if not x:
            continue

        # Get y
        if not y:
            continue

        # Get z
        if not z:
            continue

        # Stuff that depends on x, y, and z

-2

returnযদি শর্তটি ব্যবহার করে আপনাকে ফাংশন থেকে ফিরিয়ে দেবে, যাতে আপনি যদি শর্তটি ভাঙ্গতে ফিরে ব্যবহার করতে পারেন।


4
তিনি যদি ফাংশনটি থেকে বের না হন তবে তা ভাঙতে চান
স্টিলথঅনে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.