Jakie są rodzaje metod przedwczesnego wychodzenia z if
klauzuli?
Są chwile, kiedy piszę kod i chcę umieścić break
instrukcję wewnątrz if
klauzuli, tylko po to, aby pamiętać, że mogą one być używane tylko do pętli.
Jako przykład weźmy następujący kod:
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
Mogę wymyślić jeden sposób, aby to zrobić: zakładając, że przypadki wyjścia mają miejsce w zagnieżdżonych instrukcjach if, zawiń pozostały kod w duży blok else. Przykład:
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
Problem polega na tym, że więcej lokalizacji wyjścia oznacza więcej zagnieżdżonego / wciętego kodu.
Alternatywnie mógłbym napisać kod, aby if
klauzule były jak najmniejsze i nie wymagały żadnych wyjść.
Czy ktoś zna dobry / lepszy sposób na wyjście z if
klauzuli?
Jeśli są jakieś powiązane klauzule else-if i else, myślę, że zakończenie spowoduje ich pominięcie.
źródło
elif
?if a: #stuff; #stuff_inbetween; if b: #stuff;
. Kod pośredni zależy od,not a
ale nie zależy odb
.elif
stackoverflow.com/a/2069680/7045119Odpowiedzi:
(Ta metoda działa dla
if
s, wielu zagnieżdżonych pętli i innych konstrukcji, z których nie możnabreak
łatwo.)Zawiń kod w jego własnej funkcji. Zamiast
break
używaćreturn
.Przykład:
źródło
(Nie używaj tego, proszę.)
źródło
goto
.źródło
while True:
. Tylko pamiętaj, abybreak
na końcu zamieścić oświadczenie! W przypadku języków z konstrukcją do-while jest to bardziej idomatyczne:do { code that can conditionally break out } while (false);
Możesz emulować funkcjonalność goto z wyjątkami:
Zastrzeżenie: chcę tylko zwrócić uwagę na możliwość robienia rzeczy w ten sposób, podczas gdy w żaden sposób nie popieram tego jako rozsądnego w normalnych okolicznościach. Jak wspomniałem w komentarzu do pytania, zdecydowanie lepszym rozwiązaniem jest ustrukturyzowanie kodu tak, aby w pierwszej kolejności uniknąć bizantyjskich warunków warunkowych. :-)
źródło
może to?
źródło
elif
. Chociaż myślę, że to nie zadziała w sytuacji, w której chcę, aby kod był wykonywany między zagnieżdżonymi instrukcjami if.O co właściwie pytano, moje podejście polega na umieszczeniu ich
if
w pętli z jedną pętląSprawdź to:
źródło
for _ in range(1):
zamiastwhile True:
. (1) Lepiej przedstaw swój zamiar pojedynczej pętli iteracyjnej i (2) brak instrukcji ostatniej przerwy, aby wyjść z pętli (może zostać później usunięta przez przypadek)Ogólnie mówiąc, nie. Jeśli zagnieżdżasz "jeśli" i odrywasz się od nich, robisz to źle.
Jeśli jednak musisz:
Zwróć uwagę, że funkcje nie MUSZĄ być deklarowane w instrukcji if, można je zadeklarować z wyprzedzeniem;) Byłby to lepszy wybór, ponieważ pozwoli to uniknąć późniejszej refaktoryzacji brzydkiego „jeśli / potem”.
źródło
if condition_a
iif condition_b
zagnieżdżony w plikuif some_condition
. Chcę móc wyrwać się zif some_condition
.W rzeczywistości to, co opisujesz, to instrukcje goto, które są generalnie dość mocno panoramowane. Twój drugi przykład jest dużo łatwiejszy do zrozumienia.
Jednak czystszy nadal byłby:
źródło
Jest inny sposób, który nie polega na definiowaniu funkcji (ponieważ czasami jest to mniej czytelne dla małych fragmentów kodu), nie używa dodatkowej zewnętrznej pętli while (która może wymagać szczególnego uznania w komentarzach, aby być zrozumiałym nawet na pierwszy rzut oka) , nie używa goto (...) i co najważniejsze, pozwólmy ci zachować poziom wcięcia dla zewnętrznego, jeśli tak, nie musisz zaczynać zagnieżdżania rzeczy.
Tak, to również wymaga ponownego spojrzenia na czytelność, jednak jeśli fragmenty kodu są małe, nie wymaga to śledzenia żadnych pętli while, które nigdy się nie powtórzą, a po zrozumieniu, do czego służą pośrednie, jeśli są, są łatwe do odczytania, wszystko w w jednym miejscu iz tym samym wcięciem.
I powinno być całkiem wydajne.
źródło
Więc rozumiem, że próbujesz wyrwać się z zewnętrznego bloku if code
Jednym ze sposobów rozwiązania tego problemu jest to, że możesz przetestować pod kątem fałszywego warunku w zewnętrznym bloku if, który następnie niejawnie wyjdzie z bloku kodu, a następnie użyj innego bloku else do zagnieżdżenia drugiego ifs, aby coś zrobić
źródło
Jedyną rzeczą, która zastosowałaby to bez dodatkowych metod, jest
elif
poniższy przykładźródło
Oto inny sposób radzenia sobie z tym. Używa pojedynczego elementu dla pętli, która umożliwia po prostu użycie kontynuacji. Zapobiega niepotrzebnej potrzebie posiadania dodatkowych funkcji bez powodu. A dodatkowo eliminuje potencjalne nieskończone pętle while.
źródło
użycie
return
w warunku if zwróci cię z funkcji, więc możesz użyć return do złamania warunku if.źródło