(nawet tytuł ten będzie powodować płomienie, zdaję sobie sprawę)Symulacja C-styl dla pętli w python
Python dokonał świadomego wyboru projektu do skorzystania for
pętla wyraźne iterables, z korzyścią znacznie uproszczony kod w większości przypadków.
Jednak czasami jest to dość uciążliwe skonstruować iterable jeśli przypadek testowy i funkcja aktualizacji są skomplikowane i tak znalazłem się na piśmie następujące pętli while:
val = START_VAL
while <awkward/complicated test case>:
# do stuff
...
val = <awkward/complicated update>
Problem polega na tym, że aktualizacja jest w dolnej części bloku while
, co oznacza, że jeśli chcę mieć continue
osadzone gdzieś w nim muszę:
stosowania duplikat kod skomplikowanej/awkard zaktualizować, a
ryzykujemy zapominając go i posiadające mój kod nieskończoną pętlę
mogłem przejść trasę ręcznie toczenia skomplikowanej iterator:
def complicated_iterator(val):
while <awkward/complicated test case>:
yeild val
val = <awkward/complicated update>
for val in complicated_iterator(start_val):
if <random check>:
continue # no issues here
# do stuff
To wydaje mi się ceniła zbyt gadatliwy i skomplikowany. Czy użytkownicy przepełnienia stosu mają prostszą propozycję?
odpowiedzi na komentarze:
@Glenn Maynard: Tak, ja oddalił odpowiedź. Złe jest pisanie pięciu wierszy, jeśli istnieje sposób na zrobienie tego w jednym ... szczególnie w przypadku, który pojawia się cały czas (pętla jest wspólną cechą programów Turinga-Kompletnych).
Dla osób szukających konkretnego przykładu: załóżmy, że pracuję z niestandardową biblioteką dat. Moje pytanie będzie wówczas, jak można wyrazić to w Pythonie:
for (date = start; date < end; date = calendar.next_quarter_end(date)):
if another_calendar.is_holiday(date):
continue
# ... do stuff...
sklepu starą val i natychmiast zaktualizować val w następnym wierszu? i używacie oldwalstwa wszędzie, gdzie używaliście val? –
Prawdziwy przykład kodu byłby miły. Mam _never_ musiałem napisać kod, który jest niezręcznie wyglądający w Pythonie ... –
Co jest nie tak z pierwszym? Potrzebujesz wszystkich tych elementów. Czy to tylko, że C pozwala na wszystko w jednym wierszu, a python nie? – phkahler