Lesson 6
Podczas gdy pętla
1. Podczas gdy pętla
while
pętla powtarza sekwencję działań wiele razy, aż jakiś warunek zostanie oceniony jako False
. Warunek jest podawany przed ciałem pętli i jest sprawdzany przed każdym wykonaniem korpusu pętli. Zazwyczaj, while
pętla jest używana, gdy niemożliwe jest ustalenie dokładnej liczby iteracji pętli z góry.
Składnia while
pętli w najprostszym przypadku wygląda następująco:
while some condition: a block of statements
Python najpierw sprawdza warunek. Jeśli jest to fałsz, a następnie pętla jest zakończona, a sterowanie jest przekazywane do następnej instrukcji po while
ciała pętli. Jeśli warunek jest prawdziwy, to ciało pętli jest wykonywane, a następnie warunek jest ponownie sprawdzany. To trwa, dopóki warunek jest prawdziwy. Gdy warunek staje się fałszywy, pętla kończy się i kontrola jest przekazywana do następnej instrukcji po pętli.
Na przykład poniższy fragment programu drukuje kwadraty wszystkich liczb całkowitych od 1 do 10. Tutaj można zastąpić pętlę "while" pętlą for ... in range(...)
:
i = 1 while i <= 10: print(i ** 2) i += 1
W tym przykładzie zmienna i
wewnątrz pętli iteruje od 1 do 10. Taka zmienna, której wartość zmienia się wraz z każdą nową iteracją pętli nazywana jest licznikiem. Zauważ, że po wykonaniu tego fragmentu wartość zmiennej i
jest zdefiniowana i jest równa 11
, ponieważ kiedy i == 11
warunek i <= 10
jest fałszywy po raz pierwszy.
Inny przykład użycie while
pętli w celu określenia liczby cyfr liczb całkowitych n
:
n = int(input()) length = 0 while n > 0: n //= 10 # jest to równoważne n = n // 10 length += 1 print(length) # 4
Przy każdej iteracji wycinamy ostatnią cyfrę liczby używając dzielenia liczby całkowitej przez 10 ( n //= 10
). W zmiennej length
liczymy ile razy to zrobiliśmy.
W Pythonie jest inny, łatwiejszy sposób rozwiązania tego problemu:
.
2. Przepływ regulacji pętli: else
Można napisać instrukcję else:
po treści w pętli, która jest wykonywana raz po zakończeniu pętli:
i = 1 while i <= 10: print(i) i += 1 else: print('Loop ended, i =', i)
Na pierwszy rzut oka stwierdzenie to nie wydaje się mieć sensu, ponieważ ciało else:
statement może być po prostu umieszczone po zakończeniu pętli. Instrukcja "else" po pętli ma sens tylko wtedy, gdy jest używana w połączeniu ze break
instrukcji. Jeśli podczas wykonywania pętli interpreter Pythona napotka break
, natychmiast zatrzymuje wykonywanie pętli i wychodzi z niej. W takim przypadku gałąź else:
branch nie zostanie wykonana. Tak więc, break
jest używany do przerwania wykonywania pętli podczas połowy dowolnej iteracji.
Oto przykład podobny do Black Jacka: program odczytujący liczby i sumujący go do momentu, w którym suma stanie się większa lub równa 21. Sekwencja wejściowa kończy się na 0, aby program mógł się zatrzymać nawet, jeśli suma wszystkich liczb jest równa mniej niż 21.
Zobaczmy, jak zachowuje się na różnych wejściach.
Wersja 1. Po sprawdzeniu warunku pętla jest wychodzona normalnie, więc wykonywana jest gałąź "else".
total_sum = 0 a = int(input()) while a != 0: total_sum += a if total_sum >= 21: print('Total sum is', total_sum) break a = int(input()) else: print('Total sum is less than 21 and is equal to', total_sum, '.')
Wersja 2. Pętla jest przerwana przez break
, więc gałąź "else" jest pomijana.
total_sum = 0 a = int(input()) while a != 0: total_sum += a if total_sum >= 21: print('Total sum is', total_sum) break a = int(input()) else: print('Total sum is less than 21 and is equal to', total_sum, '.')
Odmiana "Else" może być również używana z pętlą "for". Spójrzmy na przykład, gdy program odczytuje 5 liczb całkowitych, ale zatrzymuje się zaraz po spełnieniu pierwszej ujemnej liczby całkowitej.
Wersja 1. Pętla wychodzi normalnie, więc wykonywana jest gałąź "else".
for i in range(5): a = int(input()) if a < 0: print('Met a negative number', a) break else: print('No negative numbers met')
Wersja 2. Pętla zostaje przerwana, więc gałąź "else" nie jest wykonywana.
for i in range(5): a = int(input()) if a < 0: print('Met a negative number', a) break else: print('No negative numbers met')
3. Przepływ regulacji pętli: kontynuuj
Inna instrukcja używana do kontrolowania wykonywania pętli jest continue
. Jeśli interpreter Pythona spełnia continue
gdzieś w środku iteracji pętli, to pomija wszystkie pozostałe instrukcje i przechodzi do następnej iteracji.
for num in range(2, 10): if num % 2 == 0: print("Found an even number", num) continue print("Found a number", num)
Jeśli break
i continue
są umieszczone w kilku zagnieżdżonych pętlach, mają wpływ tylko na wykonanie najbardziej wewnętrznej. Spójrzmy na raczej głupi przykład, aby to zademonstrować:
for i in range(3): for j in range(5): if j > i: # zrywa tylko wartość dla linii 2 break print(i, j)
Instrukcje break
i continue
są odradzane, jeśli możesz wdrożyć swój pomysł bez ich używania. Oto typowy przykład złego użycia break
: ten kod zlicza liczbę cyfr w liczbie całkowitej.
n = int(input()) length = 0 while True: length += 1 n //= 10 if n == 0: break print('Length is', length)
Jest to czystsze i łatwiejsze do odczytania, aby przerobić tę pętlę z sensownym warunkiem pętli:
n = int(input()) length = 0 while n != 0: length += 1 n //= 10 print('Length is', length)
4. Wielokrotne przypisanie
W języku Python możliwe jest, aby pojedyncza instrukcja przypisania zmieniała wartość wielu zmiennych. Zobaczmy:
a, b = 0, 1
Efekt pokazany powyżej kodu można zapisać jako:
a = 0 b = 1
Różnica między tymi dwiema wersjami polega na tym, że wielokrotne przypisanie zmienia wartości dwóch zmiennych jednocześnie.
Wielokrotne przypisanie jest przydatne, gdy zachodzi potrzeba wymiany wartości dwóch zmiennych. W starszych językach programowania bez obsługi wielokrotnego przypisania można to zrobić za pomocą zmiennej pomocniczej:
a = 1 b = 2 tmp = a a = b b = tmp print(a, b) # 2 1
W Pythonie ta sama wymiana może być zapisana w jednym wierszu:
a = 1 b = 2 a, b = b, a print(a, b) # 2 1
Lewa strona "=" powinna mieć rozdzieloną przecinkami listę nazw zmiennych. Prawa strona może być dowolnymi wyrażeniami oddzielonymi przecinkami. Lista po lewej i po prawej stronie powinna mieć taką samą długość.