Dlaczego python używa pętli' else ' po for I while?
Rozumiem jak działa ta konstrukcja:
for i in range(10):
print(i)
if i == 9:
print("Too big - I'm giving up!")
break;
else:
print("Completed successfully")
Ale nie rozumiem, dlaczego else
jest tutaj używane jako słowo kluczowe, ponieważ sugeruje, że dany kod działa tylko wtedy, gdy blok for
się nie kończy, co jest przeciwieństwem tego, co robi! Bez względu na to, jak o tym myślę, mój mózg nie może płynnie przejść od for
do else
bloku. Dla mnie, continue
lub continuewith
byłoby bardziej sensowne (i staram się trenować, aby to czytać jako takie).
I ' m zastanawiasz się, jak programiści Pythona czytają tę konstrukcję w swojej głowie (lub na głos, jeśli chcesz). Może brakuje mi czegoś, co ułatwiłoby rozszyfrowanie takich bloków kodu?
20 answers
To dziwna konstrukcja nawet dla doświadczonych programistów Pythona. W połączeniu z for-loopami oznacza to w zasadzie " znajdź jakiś element w iterable, w przeciwnym razie, jeśli nie znaleziono żadnego, zrób ...". Jak w:
found_obj = None
for obj in objects:
if obj.key == search_key:
found_obj = obj
break
else:
print('No object found.')
Ale za każdym razem, gdy widzisz ten konstrukt, lepszą alternatywą jest albo zamknięcie wyszukiwania w funkcji:
def find_obj(search_key):
for obj in objects:
if obj.key == search_key:
return obj
Lub użyć listy:
matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
print('Found {}'.format(matching_objs[0]))
else:
print('No object found.')
Nie jest semantycznie równoważny z pozostałymi dwoma wersjami, ale działa wystarczająco dobrze w krytycznym braku wydajności kod, w którym nie ma znaczenia, czy iterujesz całą listę, czy nie. Inni mogą się nie zgadzać, ale ja osobiście unikałbym używania bloków for-else lub while-else w kodzie produkcyjnym.
Zobacz także [Python-ideas] podsumowanie for...else threads
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 15:22:37
Powszechnym konstruktem jest uruchamianie pętli, dopóki coś nie zostanie znalezione, a następnie wyrwanie się z pętli. Problem polega na tym, że jeśli wyłamię się z pętli lub pętla się skończy, muszę ustalić, który przypadek się wydarzył. Jedną z metod jest utworzenie znacznika lub zmiennej przechowującej, która pozwoli mi wykonać drugi test, aby zobaczyć, jak pętla została zakończona.
Załóżmy na przykład, że muszę przeszukiwać listę i przetwarzać każdy element, aż zostanie znaleziony znacznik, a następnie przestać go przetwarzać. If the flag item is missing then należy podnieść wyjątek.
Za pomocą Pythona for
...else
construct you have
for i in mylist:
if i == theflag:
break
process(i)
else:
raise ValueError("List argument missing terminal flag.")
Porównaj to z metodą, która nie używa tego cukru składniowego:
flagfound = False
for i in mylist:
if i == theflag:
flagfound = True
break
process(i)
if not flagfound:
raise ValueError("List argument missing terminal flag.")
W pierwszym przypadku {[4] } jest ściśle związana z pętlą for, z którą działa. W drugim Wiązanie nie jest tak mocne, a błędy mogą być wprowadzane podczas konserwacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 05:50:37
Jest znakomita prezentacja Raymonda Hettingera, zatytułowana przekształcanie kodu w piękny, Idiomatyczny Python, w którym krótko omawia historię konstrukcji for ... else
. Odpowiednia sekcja to " rozróżnianie wielu punktów wyjścia w pętlach ", zaczynając od 15: 50 i kontynuując przez około trzy minuty. Oto najważniejsze punkty:
- konstrukcja
for ... else
została opracowana przez Donalda Knutha jako zamiennik pewnegoGOTO
zastosowania przypadki; - ponowne użycie słowa kluczowego
else
miało sens, ponieważ "tego użył Knuth, a ludzie wiedzieli, że w tamtym czasie wszystkie [for
] Oświadczenia miałyif
iGOTO
pod spodem, i oczekiwali, żeelse
;" - z perspektywy czasu powinno się nazywać "bez przerwy" (lub ewentualnie "nobreak"), a wtedy nie byłoby to mylące.*
Więc, jeśli pytanie brzmi: "Dlaczego nie zmienią tego słowa kluczowego?"wtedy Kot Plus Plus prawdopodobnie dał najdokładniejszą odpowiedź - w ten punkt byłby zbyt destrukcyjny dla istniejącego kodu, aby był praktyczny. Ale jeśli naprawdę zadajesz pytanie, dlaczego else
został użyty ponownie, cóż, najwyraźniej wtedy wydawało się to dobrym pomysłem.
Osobiście podoba mi się kompromis komentowania # no break
in-line wszędzie tam, gdzie else
może być mylone, na pierwszy rzut oka, jako należące do pętli. To dość jasne i zwięzłe. Ta opcja dostaje krótką wzmiankę w podsumowaniu, które Bjorn podlinkował na końcu jego odpowiedź:
Dla kompletności, powinienem wspomnieć, że z niewielką zmianą w składnia, Programiści chcący tę składnię mogą ją mieć już teraz:
for item in sequence: process(item) else: # no break suite
* bonusowy cytat z tej części filmu: "tak jak gdybyśmy nazwali lambda makefunction, nikt by nie zapytał:' co robi lambda?'"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:08
Aby było to proste, można o tym tak myśleć;
- jeśli napotka polecenie
break
W pętlifor
, częśćelse
nie zostanie wywołana. - Jeśli nie napotka
break
polecenia w pętlifor
, zostanie wywołana częśćelse
.
Innymi słowy, jeśli iteracja pętli for nie jest "złamana" przez break
, zostanie wywołana część else
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-21 11:29:53
Ponieważ nie chcieli wprowadzać nowego słowa kluczowego do języka. Każdy kradnie identyfikator i powoduje problemy z kompatybilnością wsteczną, więc zwykle jest to ostateczność.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 16:20:03
Myślę, że dokumentacja ma świetne Wyjaśnienie else, continue
[...] jest wykonywana, gdy pętla zakończy się poprzez wyczerpanie listy (z for) lub gdy warunek stanie się false( z while), ale nie, gdy pętla zostanie zakończona instrukcją break."
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-25 11:38:56
Najprostszym sposobem, jaki znalazłem ,aby "uzyskać" to, co zrobił for/else, a co ważniejsze, kiedy go użyć, było skoncentrowanie się na tym, do czego skacze instrukcja break. Konstrukcja For / else jest pojedynczym blokiem. Przerwa wyskakuje z bloku, a więc przeskakuje " nad " klauzulą else. Gdyby treść klauzuli else po prostu podążała za klauzulą for, nigdy nie zostałaby przeskoczona, a więc równoważna logika musiałaby być dostarczona przez umieszczenie jej w klauzuli if. Zostało to już powiedziane, ale nie do końca w tych słowa, Więc może pomóc komuś innemu. Spróbuj uruchomić następujący fragment kodu. Jestem z całego serca za komentarzem "bez przerwy" dla jasności.
for a in range(3):
print(a)
if a==4: # change value to force break or not
break
else: #no break +10 for whoever thought of this decoration
print('for completed OK')
print('statement after for loop')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 12:54:02
Przeczytałem coś w stylu:
Jeśli nadal na warunkach, aby uruchomić pętlę, zrób coś, else Zrób coś innego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 16:20:33
Ponieważ część techniczna została dość dużo odpowiedzi, mój komentarz jest tylko w związku z zamieszanie , które produkują to recycled słowo kluczowe.
Będąc Pythonem bardzo wymownym językiem programowania, nadużywanie słowa kluczowego jest bardziej notoryczne. Słowo kluczowe else
doskonale opisuje część przepływu drzewa decyzyjnego, "if you can' t do this, (else) do that". To implikowane w naszym własnym języku.
Zamiast tego, używając tego słowa kluczowego z while
i for
wypowiedzi powodują zamieszanie. Powodem, dla którego nasza kariera programistyczna nauczyła nas, że else
oświadczenie znajduje się w drzewie decyzyjnym; jego Zakres logiczny, wrapper, który warunkowo zwraca ścieżkę, którą należy podążać. Tymczasem deklaracje loop mają graficzny, wyraźny cel, aby coś osiągnąć. Cel jest osiągany po ciągłych iteracjach procesu.
if / else
wskaż ścieżkę . Pętle podążaj ścieżką, aż " cel " będzie zakończone .
Problem polega na tym, że else
jest słowem, które jasno określa ostatnią opcję w warunku. Semantyka tego słowa jest zarówno dzielona przez Python i ludzki język. Ale słowo else w ludzkim języku nigdy nie jest używane do wskazania działań, które ktoś lub coś podejmie po zakończeniu czegoś. Zostanie ona użyta, jeśli w trakcie jej wypełniania pojawi się problem (bardziej jak break ).
Na końcu, słowo kluczowe będzie / align = "left" / Jest jasne, że był to błąd, wyraźniejszy, gdy każdy programista próbuje wymyślić historię, aby zrozumieć jej użycie jak jakieś urządzenie mnemoniczne. Chciałbym, żeby zamiast tego wybrali słowo kluczowe then
. Uważam, że to słowo kluczowe idealnie pasuje do tego iteracyjnego przepływu, payoff po pętli.
Przypomina to sytuację, jaką ma jakieś dziecko po każdym kroku składania zabawki: i potem jaki Tata?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-12 18:12:41
Czytam to tak: "gdy iterable
jest całkowicie wyczerpana, a wykonanie ma przejść do następnego polecenia po zakończeniu for
, zostanie wykonana klauzula else."Tak więc, gdy iteracja zostanie przerwana przez break
, nie zostanie ona wykonana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-07 04:32:57
Świetne odpowiedzi to:
Moja uwaga pochodzi z tego, co Donald Knuth kiedyś powiedział (Niestety nie mogę znaleźć odniesienia) , że istnieje konstrukcja, w której while-else jest nie do odróżnienia od if-else, mianowicie (w Pythonie): {]}
x = 2
while x > 3:
print("foo")
break
else:
print("boo")
Ma taki sam przepływ (wyłączając małe różnice poziomów) jak:
x = 2
if x > 3:
print("foo")
else:
print("boo")
Chodzi o to, że że if-else można uznać za cukier składniowy dla while-else, który ma implicit break
na końcu bloku if
. Odwrotna implikacja, że pętla while
jest rozszerzeniem do if
, jest bardziej powszechna (jest to po prostu powtarzane/zapętlone sprawdzenie warunkowe), ponieważ if
jest często nauczane przed while
. Nie jest to jednak prawdą, ponieważ oznaczałoby to else
blokowanie while-else byłoby wykonywane za każdym razem, gdy warunek jest false.
Aby ułatwić Ci zrozumienie pomyśl o tym, że sposób:
BEZ
break
,return
, itd., pętla kończy się tylko wtedy, gdy warunek nie jest już prawdziwy i w takim przypadkuelse
blok również zostanie wykonany raz. W przypadku Pythonafor
należy wziąć pod uwagę pętle w stylu Cfor
(z warunkami) lub przetłumaczyć je nawhile
.
Kolejna uwaga:
Przedwczesny
break
,return
, itd. inside loop sprawia, że warunek nie może stać się fałszywy, ponieważ wykonanie wyskoczyło z pętli, podczas gdy warunek był prawdziwy i nigdy nie wróć, żeby sprawdzić jeszcze raz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-20 13:37:21
Zgadzam się, to raczej " elif not [condition (s) raising break]".
Wiem, że to stary wątek, ale patrzę teraz na to samo pytanie i nie jestem pewien, czy ktoś uchwycił odpowiedź na to pytanie w sposób, w jaki je Rozumiem.
Dla mnie istnieją trzy sposoby "odczytywania" else
W For... else
lub While... else
stwierdzeniach, z których wszystkie są równoważne, to:
-
else
==
if the loop completes normally (without a break or error)
-
else
==
if the loop does not encounter a break
-
else
==
else not (condition raising break)
(prawdopodobnie istnieje taki warunek, inaczej nie miałbyś pętli)
Tak więc zasadniczo" else "w pętli jest tak naprawdę" elif ..."gdzie"..."is (1) no break, which is equivalent to (2) NOT [condition(s) raising break].
Myślę, że kluczem jest to, że else
jest bez sensu bez "przerwy", więc for...else
zawiera:
for:
do stuff
conditional break # implied by else
else not break:
do more stuff
Tak więc podstawowe elementy for...else
pętli są następujące i można je przeczytać w plainer English as:
for:
do stuff
condition:
break
else: # read as "else not break" or "else not condition"
do more stuff
Jak mówią inne plakaty, przerwa jest zazwyczaj podnoszona, gdy jesteś w stanie zlokalizować to, czego szuka twoja pętla, więc else:
staje się "co zrobić, jeśli element docelowy nie znajduje się".
Przykład
Można również używać pętli exception handling, breaks I for razem.
for x in range(0,3):
print("x: {}".format(x))
if x == 2:
try:
raise AssertionError("ASSERTION ERROR: x is {}".format(x))
except:
print(AssertionError("ASSERTION ERROR: x is {}".format(x)))
break
else:
print("X loop complete without error")
wynik
x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run
Przykład
Prosty przykład z przerwą hit.
for y in range(0,3):
print("y: {}".format(y))
if y == 2: # will be executed
print("BREAK: y is {}\n----------".format(y))
break
else: # not executed because break is hit
print("y_loop completed without break----------\n")
wynik
y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run
Przykład
Prosty przykład, w którym nie ma przerwy, nie ma warunku powodującego przerwę i nie ma błędu.
for z in range(0,3):
print("z: {}".format(z))
if z == 4: # will not be executed
print("BREAK: z is {}\n".format(y))
break
if z == 4: # will not be executed
raise AssertionError("ASSERTION ERROR: x is {}".format(x))
else:
print("z_loop complete without break or error\n----------\n")
wynik
z: 0
z: 1
z: 2
z_loop complete without break or error
----------
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-08 17:22:29
Słowo kluczowe else
może być tutaj mylące i jak wiele osób wskazało, coś w rodzaju nobreak
, notbreak
jest bardziej odpowiedni.
Aby logicznie zrozumieć for ... else ...
, porównaj go z try...except...else
, a nie if...else...
, większość programistów Pythona zna następujący kod:
try:
do_something()
except:
print("Error happened.") # The try block threw an exception
else:
print("Everything is find.") # The try block does things just find.
Podobnie, pomyśl o break
jako o specjalnym rodzaju Exception
:
for x in iterable:
do_something(x)
except break:
pass # Implied by Python's loop semantics
else:
print('no break encountered') # No break statement was encountered
Różnica jest python
implikuje except break
i nie można tego wypisać, więc staje się:
for x in iterable:
do_something(x)
else:
print('no break encountered') # No break statement was encountered
Tak, wiem to porównanie może być trudne i męczące, ale wyjaśnia zamieszanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-05 02:36:42
Kody w bloku instrukcji else
będą wykonywane, gdy pętla for
nie została przerwana.
for x in xrange(1,5):
if x == 5:
print 'find 5'
break
else:
print 'can not find 5!'
#can not find 5!
Z Docs: instrukcje break I continue oraz klauzule else na pętlach
Instrukcje pętli mogą mieć klauzulę else; jest ona wykonywana, gdy pętla zakończy się z powodu wyczerpania listy (z for) lub gdy warunek stanie się false( z while), ale nie gdy pętla zostanie zakończona instrukcją break. Przykładem tego jest następująca pętla, która wyszukuje dla liczb pierwszych:
>>> for n in range(2, 10): ... for x in range(2, n): ... if n % x == 0: ... print(n, 'equals', x, '*', n//x) ... break ... else: ... # loop fell through without finding a factor ... print(n, 'is a prime number') ... 2 is a prime number 3 is a prime number 4 equals 2 * 2 5 is a prime number 6 equals 2 * 3 7 is a prime number 8 equals 2 * 4 9 equals 3 * 3
(Tak, to jest prawidłowy kod. Przyjrzyj się uważnie: klauzula else należy do pętli for, a nie do instrukcji if.)
W przypadku użycia z pętlą, klauzula else ma więcej wspólnego z klauzulą else instrukcji try niż z instrukcjami if: klauzula else instrukcji TRY jest uruchamiana, gdy nie występuje wyjątek, a klauzula else pętli jest uruchamiana, gdy nie występuje przerwa. Więcej informacji na temat instrukcji try i wyjątków można znaleźć w sekcji Obsługa wyjątków.
The continue twierdzenie, również zapożyczone z C, kontynuuje kolejną iterację pętli:
>>> for num in range(2, 10): ... if num % 2 == 0: ... print("Found an even number", num) ... continue ... print("Found a number", num) Found an even number 2 Found a number 3 Found an even number 4 Found a number 5 Found an even number 6 Found a number 7 Found an even number 8 Found a number 9
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55
Oto sposób na zastanowienie się nad tym, że nie widziałem nikogo innego wspominającego powyżej:
Po pierwsze, pamiętaj, że pętle for są w zasadzie tylko cukrem składniowym wokół pętli while. Na przykład pętla
for item in sequence:
do_something(item)
Można przepisać (w przybliżeniu) jako
item = None
while sequence.hasnext():
item = sequence.next()
do_something(item)
Po Drugie, pamiętaj, że pętle while są w zasadzie powtórzonymi blokami if! Zawsze możesz odczytać pętlę while jako "jeśli ten warunek jest prawdziwy, wykonaj ciało, a następnie wróć i sprawdź ponownie".
Więc while / else sprawia, że perfect sense: jest to dokładnie ta sama struktura jak if / else, z dodaną funkcjonalnością zapętlania dopóki warunek nie stanie się fałszywy, zamiast sprawdzać warunek tylko raz.
And then for / else makes perfect sense too: ponieważ wszystkie pętle for są tylko cukrem składniowym na szczycie pętli while, musisz tylko dowiedzieć się, czym jest ukryty warunek while-loop, a następnie else odpowiada, kiedy warunek ten staje się fałszywy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-11 17:52:30
for i in range(3):
print(i)
if i == 2:
print("Too big - I'm giving up!")
break;
else:
print("Completed successfully")
"else" tutaj jest szalenie proste, po prostu mean
1, "if for clause
is completed"
for i in range(3):
print(i)
if i == 2:
print("Too big - I'm giving up!")
break;
if "for clause is completed":
print("Completed successfully")
Jest to pisanie tak długich wypowiedzi jak "klauzula for jest zakończona", więc wprowadzają "else".
else
Oto jeśli w swojej naturze.
2, How about for clause is not run at all
In [331]: for i in range(0):
...: print(i)
...:
...: if i == 9:
...: print("Too big - I'm giving up!")
...: break
...: else:
...: print("Completed successfully")
...:
Completed successfully
Więc to całkowicie twierdzenie jest kombinacją logiczną:
if "for clause is completed" or "not run at all":
do else stuff
Lub ująć to tak:
if "for clause is not partially run":
do else stuff
Lub w ten sposób:
if "for clause not encounter a break":
do else stuff
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-25 04:29:46
Można by pomyśleć o tym jak,
else
jak w przypadku reszty rzeczy, lub innych rzeczy, które nie zostały zrobione w pętli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 16:25:26
Oto kolejny idiomatyczny przypadek użycia poza wyszukiwaniem. Załóżmy, że chcesz poczekać, aż warunek będzie prawdziwy, np. port, który ma być otwarty na zdalnym serwerze, wraz z pewnym limitem czasu. Następnie można użyć while...else
skonstruować TAK:
import socket
import time
sock = socket.socket()
timeout = time.time() + 15
while time.time() < timeout:
if sock.connect_ex(('127.0.0.1', 80)) is 0:
print('Port is open now!')
break
print('Still waiting...')
else:
raise TimeoutError()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-29 14:03:29
[10]} ja tylko starałem się to zrozumieć. Okazało się, że następujące pomaga!
• pomyśl o else
jako o połączeniu z if
wewnątrz pętli (zamiast z for
) - jeśli warunek jest spełniony, przerwij pętlę, w przeciwnym razie zrób to-z wyjątkiem jednego else
sparowanego z wieloma if
s!
• Jeśli nie if
s były spełnione w ogóle, następnie wykonać else
.
* Wielokrotność if
s może być również traktowana jako if
-elif
s!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-11 15:06:54
Rozważam strukturę jak dla (if) a else B, A Dla (if)-else jest specjalnym if-else, mniej więcej . Może pomóc zrozumieć else .
A i B są wykonywane co najwyżej raz, co jest taką samą strukturą jak If-else.
For(if) może być traktowane jako specjalne if, które wykonuje pętlę, aby spróbować spełnić warunek if. Gdy warunek if jest spełniony, a i przełamują; Else , B.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-13 18:41:45