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 if
s, meerdere geneste lussen en andere constructies die je niet gemakkelijk kunt break
.)
Wikkel de code in zijn eigen functie. Gebruik in plaats van break
return
.
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 if
s 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 elif
als 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 return
In de IF-voorwaarde zal u uit de functie retourneren,
zodat u RETOUR kunt gebruiken om de IF-voorwaarde te doorbreken.