Een if-clausule verlaten

Welke soorten methoden zijn er om een if-clausule voortijdig af te sluiten?

Er zijn momenten dat ik code schrijf en een break-instructie in een if-clausule wil plaatsen, alleen om te onthouden dat die alleen voor loops kunnen worden gebruikt .

Laten we de volgende code als voorbeeld nemen:

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

Ik kan een manier bedenken om dit te doen: ervan uitgaande dat de exit-gevallen plaatsvinden in geneste if-instructies, wikkel de resterende code in een groot else-blok. Voorbeeld:

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

Het probleem hiermee is dat meer uitgangslocaties meer nesting/ingesprongen code betekenen.

Als alternatief zou ik mijn code zo kunnen schrijven dat de if-clausules zo klein mogelijk zijn en geen exits vereisen.

Weet iemand een goede/betere manier om een if-clausule te verlaten?

Als er andere else-if- en else-clausules zijn, denk ik dat het verlaten ervan deze zou overslaan.


Antwoord 1, autoriteit 100%

(Deze methode werkt voor ifs, meerdere geneste lussen en andere constructies die je niet gemakkelijk kunt break.)

Wikkel de code in zijn eigen functie. Gebruik in plaats van breakreturn.

Voorbeeld:

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

Antwoord 2, Autoriteit 53%

van goto importeren goto, label
Als sommige_condition:
  ...
  Als condition_a:
    # doe iets
    # en verlaat vervolgens de buitenkant als blok
    goto .end
  ...
  Als condition_b:
    # doe iets
    # en verlaat vervolgens de buitenkant als blok
    goto .end
  # meer code hier
label .end

(gebruik dit niet echt, alstublieft.)


Antwoord 3, Autoriteit 23%

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

Antwoord 4, Autoriteit 10%

U kunt de functionaliteit van Goto emuleren met uitzonderingen:

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

DISCLAIMER: Ik wil alleen de aandacht van de Mogelijkheid van het doen van dingen op deze manier doen, terwijl ik het op geen enkele manier als redelijk onder normale omstandigheden onderschrijft. Zoals ik al zei in een opmerking over de vraag, het structureren van code om Byzantijnse voorblijfselen in de eerste plaats te vermijden, veruit de voorkeur. : -)


Antwoord 5, Autoriteit 7%

Kan dit zijn?

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

Antwoord 6, autoriteit 6%

Voor wat er eigenlijk werd gevraagd, mijn benadering is om die ifs in een lus met één lus te plaatsen

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

Test het:

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

Antwoord 7, autoriteit 2%

Over het algemeen niet doen. Als je “if’s” nest en ze breekt, doe je het verkeerd.

Als het echter moet:

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

Let op, de functies MOETEN niet gedeclareerd worden in de if-statement, ze kunnen van tevoren worden gedeclareerd 😉 Dit zou een betere keuze zijn, omdat het zal voorkomen dat een lelijke if/then later opnieuw moet worden berekend.


Antwoord 8, autoriteit 2%

Er is een andere manier die niet afhankelijk is van het definiëren van functies (omdat dat soms minder leesbaar is voor kleine codefragmenten), geen extra buitenste while-lus gebruikt (die misschien speciale waardering in de opmerkingen nodig heeft om zelfs begrijpelijk te zijn op eerste gezicht), maakt geen gebruik van goto (…) en het belangrijkste is dat u uw inspringingsniveau voor de buitenkant behoudt, als u zo geen dingen hoeft te nesten.

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

Ja, dat heeft ook een tweede blik nodig voor de leesbaarheid, maar als de codefragmenten klein zijn, hoeft u geen while-loops te volgen die nooit zullen worden herhaald en nadat u begrijpt waar de tussenliggende ifs voor zijn, is het gemakkelijk leesbaar , allemaal op één plek en met dezelfde inspringing.

En het zou behoorlijk efficiënt moeten zijn.


Antwoord 9

In feite zijn wat je beschrijft goto-statements, die over het algemeen behoorlijk zwaar worden gepand. Uw tweede voorbeeld is veel gemakkelijker te begrijpen.

Schoner zou echter nog steeds zijn:

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

Antwoord 10

Dus hier begrijp ik dat je probeert te ontsnappen uit het buitenste if-codeblok

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

Eén uitweg is dat je kunt testen op een false voorwaarde in het buitenste if-blok, dat dan impliciet het codeblok verlaat, en vervolgens een else-blok gebruikt om de andere ifs te nesten in iets doen

if test_for_false:
    # Exit the code(which is the outer if code)
else:
    if condition_a:
        # Do something
    if condition_b:
        # Do something

Antwoord 11

Hier is een andere manier om dit aan te pakken. Het maakt gebruik van een enkel item voor de lus waarmee u gewoon doorgaan kunt gebruiken. Het voorkomt dat de onnodige behoefte om geen enkele reden extra functies te hebben. En elimineert bovendien potentiële oneindige tijdens loops.

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

Antwoord 12

Het enige dat dit zou toepassen zonder aanvullende methoden is elifals het volgende voorbeeld

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

Antwoord 13

Gebruik returnIn de IF-voorwaarde zal u uit de functie retourneren,
zodat u RETOUR kunt gebruiken om de IF-voorwaarde te doorbreken.

Other episodes