article banner

Pętle w Pythonie

Cześć! To jest fragment książki Python od podstaw, która ma pomóc w nauce programowania od zera. Znajdziesz ją na Allegro, w Empikach i w księgarniach internetowych.

Tak jak mówiliśmy w poprzednich rozdziałach, każda linia kodu jest instrukcją. Te zaś wykonują się kolejno od góry do dołu.

print("To zostanie wypisane najpierw,")
print("a to potem")
# Wypisze:  
# To zostanie wypisane najpierw,  
# a to potem

Kolejność wykonywania instrukcji nazywamy przepływem sterowania. Jest to istotne, ponieważ pewne instrukcje zmieniają ten przepływ. Jedną z nich już poznaliśmy — instrukcja if pozwala nam ominąć część kodu, gdy warunek nie jest spełniony. Do tej pory jednak nie byliśmy w stanie sprawić, by pojedyncze polecenie wykonało się więcej niż raz. Tę barierę przełamiemy dopiero teraz, a posłużą nam do tego pętle.

Pętla while

Definicja pętli while niewiele różni się od warunku if. Zmienia się tylko słowo kluczowe if na while. Zachowanie również jest do pewnego stopnia podobne.

Jeśli warunek nie jest spełniony (zwraca False), to ciało jest pomijane (podobnie jak w przypadku instrukcji warunkowej if).

while False:
    print("Ten tekst nigdy się nie wypisze")

if False:
    print("Ten tekst nigdy się nie wypisze")

# Nic się nie wypisze

Jeśli jednak warunek jest spełniony (zwraca True), to ciało zostanie wywołane. Tutaj while różni się od if tym, że warunek sprawdzamy ponownie, po czym, jeśli wciąż jest spełniony, to wywołujemy ciało raz jeszcze. Proces ten powtarzamy tak długo, aż warunek zwróci False.

W poniższym przypadku pierwszy warunek będzie spełniony tylko raz, bo w ciele zmieniamy wartość zmiennej should_print na False. Drugi będzie spełniony trzykrotnie, bo w ciele zwiększamy wartość zmiennej, aż w końcu jej wartość będzie większa od 2.

should_print = True
while should_print:
    print("Będzie wypisane tylko raz")
    should_print = False

# Wypisze:    
# Będzie wypisane tylko raz

printed_times = 0
while printed_times <= 2:
    print(f"Wypisane dla {printed_times}")
    printed_times += 1
    # inaczej printed_times = printed_times + 1

# Wypisze:
# Wypisane dla 0
# Wypisane dla 1
# Wypisane dla 2

Wracając do historii Jasia, można użyć pętli, aby zapisać polecenie jego mamy: "Będziesz pisał wypracowanie, dopóki go nie skończysz".

while not essey_finished:
    write_essey()

Jeśli w pętli umieścilibyśmy warunek, który zawsze jest spełniony, pętla ta będzie wykonywana w nieskończoność. Poniższy program nigdy nie przestanie wypisywać "LOL" (chyba że go wyłączymy).

# Będzie wypisywać w nieskończoność
while True:
    print("LOL")

Oznacza to, że ciało pętli może zostać wykonane od zera aż do nieskończonej liczby razy. Pętla, która nigdy się nie kończy, nazywana jest pętlą nieskończoną. Najczęściej jest ona wynikiem błędu programisty.

Typowa sytuacja użycia pętli ma miejsce, gdy w ciele powiększamy jej wartość, aż przekroczy ona ograniczenie górne. Tak tworzy się znane nam ze szkoły ciągi liczbowe. Jeśli chcielibyśmy wypisać kolejne wielokrotności cyfry 3 (gdzie kolejny element powstaje poprzez dodanie liczby 3 do poprzedniej), moglibyśmy użyć następującej pętli:

i = 3
while i <= 10:
    print(i)
    i += 3  # albo i = i + 3

# Wypisze:
# 3
# 6
# 9

Jeśli chcielibyśmy wypisać ciąg kolejnych potęg liczby 2 (gdzie kolejny element powstaje poprzez podwojenie kolejnego), moglibyśmy użyć następującej pętli:

i = 1
while i <= 100:
    print(i)
    i *= 2  # albo i = i * 2

# Wypisze:
# 1
# 2
# 4
# 8
# 16
# 32
# 64

Ćwiczenie: Ciągi matematyczne

  • Wypisz kolejne liczby parzyste (wielokrotności 2), zaczynając od 0, a mniejsze od 100.
  • Wypisz kolejne wielokrotności 7, zaczynając od 0, a mniejsze od 100.
  • Wyświetl kolejne wartości powstałe w wyniku wielokrotnego potrajania liczby, zaczynając od 13, tak długo, jak długo wynik jest mniejszy niż 1000.
  • Wypisz kwadraty kolejnych liczb całkowitych mniejszych od 1000.

Odpowiedzi na końcu książki.

Pętla for

Kolejną często używaną pętlą jest for. W późniejszych częściach tej książki przekonamy się, że jest ona przede wszystkim wykorzystywana, by wykonać operację dla każdego z elementów listy:

names = ["Ala", "Basia", "Celina"]
for name in names:
    print("Następne imię to " + name)

# Wypisze:
# Następne imię to Ala
# Następne imię to Basia
# Następne imię to Celina

Zanim jednak wprowadzimy listy, pomówmy o nieco innym wykorzystaniu pętli for: do wykonywania operacji dla kolejnych liczb. Do tego, po prawej stronie powinniśmy użyć funkcji1 range, która tworzy zakres liczb. Gdy użyjemy jej z pojedynczą liczbą, będzie ona oznaczać, ile numerów dany zakres powinien mieć. Jeśli więc użyjemy for i in range(5), to ciało pętli zostanie wywołane dokładnie 5 razy. Jakie jednak wartości będzie przyjmowała zmienna i? Iterowanie2 domyślnie zaczynamy od liczby 0, a więc jeśli wołamy range(5) to wywołamy ciało pętli dla liczb od 0 do 4. Dzięki temu jest 5 liczb: gdybyśmy zaczęli od 0, a skończyli na 5, to ciało byłoby wywołane 6 razy. Ponieważ zaczynamy od liczby 0, powinniśmy skończyć zaraz przed liczbą podaną jako argument funkcji range.

for i in range(5):
    print(i)

# Wypisze:
# 0
# 1
# 2
# 3
# 4

W ciele pętli możemy umieścić wiele instrukcji.

for i in range(3):
    print(f"Zostały {3 - i} soki")
    print("Glup glup glup")

print("Nie ma już soku")

# Wypisze:
# Zostały 3 soki
# Glup glup glup
# Zostały 2 soki
# Glup glup glup
# Zostały 1 soki
# Glup glup glup
# Nie ma już soku

Jeśli argument funkcji range jest mniejszy od 1, to nic nie zostanie wypisane.

for i in range(0):
    print(i)

# Nic się nie wypisze

Wartość początkowa

Funkcję range możemy wywołać także z dwoma liczbami oddzielonymi przecinkiem. Wtedy pierwsza określa, od jakiej liczby powinniśmy zacząć iterowanie, a druga przed jaką powinniśmy skończyć. Tak więc range(3) zawiera 0, 12, ale już range(1, 3) zawiera tylko 12, ponieważ zaczynamy odliczanie od 1.

for i in range(1, 3):
    print(i)

# Wypisze:
# 1
# 2
for i in range(2, 5):
    print(i)

# Wypisze:
# 2
# 3
# 4

Jeśli ograniczenie końcowe będzie mniejsze lub równe wartości początkowej, nic się nie wypisze.

for i in range(5, 5):
    print(i)

Krok

W funkcji range możemy postawić jeszcze jeden argument, a mianowicie krok. Jest to liczba, o jaką wartość początkowa jest zmieniana przy kolejnych wywołaniach. Domyślnie wynosi ona 1, dlatego na przykład między 16 idziemy po kolejnych liczbach. Gdybyśmy jednak zmienili jej wartość na 2, to zobaczylibyśmy co drugą liczbę zaczynając od 1, a zatrzymując się przed 6.

for i in range(1, 6, 2):
    print(i)

# # Wypisze:
# 1
# 3
# 5

Jeśli ustawimy krok na wartość ujemną, to odliczanie będzie szło w drugą stronę.

for i in range(10, 0, -2):
    print(i)

# 10
# 8
# 6
# 4
# 2

Ćwiczenie: Przypadki użycia pętli for dla liczb

Z wykorzystaniem pętli for:

  • Wypisz 5 kolejnych liczb, zaczynając od 0,
  • Wypisz kolejne liczby, zaczynając od 5, mniejsze od 10,
  • Wypisz co czwartą liczbę od 5 do 30.
  • Wypisz kolejne liczby od 10 do 5 (bez 5).
  • Wypisz co drugą liczbę od 20 do 0 (bez 0).

Odpowiedzi na końcu książki.

Zakończenie

Pętle są bardzo przydatną i często wykorzystywaną funkcjonalnością języka Python. Poznanie i zrozumienie ich będzie procentowało. Tymczasem przejdziemy do funkcjonalności, która zdominowała współczesne projekty programistyczne, a przez wielu ekspertów określana jest jako najistotniejsza funkcjonalność języków programowania. Czas pomówić o funkcjach.

1:

Funkcje poznamy lepiej w następnym rozdziale.

2:

Iteracja od łacińskiego iteratio, czyli powtarzanie. Iteracja to czynność powtarzania tej samej operacji w pętli, z góry określoną ilość razy lub aż do spełnienia określonego warunku.