← Lekcje
Python · lekcja 07

Pętla while i pierwsze zadania

  1. Program „Zbiór jabłek”: specyfikacja i lista kroków z powtarzaniem
  2. Pętla while: powtarzaj, dopóki warunek jest prawdziwy
  3. Jeden brakujący nawias w podręczniku i co robi z programem
  4. Zadania ze strony 102: od treści zadania do listy kroków i kodu
Rozgrzewka · 3 minuty

Co pamiętacie z lekcji 6?

  1. Do czego w programie służy słowo elif?
  2. Czym różni się warunek połączony słowem and od warunku z or?
  3. Po czym Python poznaje, które linijki należą do bloku instrukcji po if?
Część 1 · Zbiór jabłek

Nie wiemy z góry, ile razy zapytamy

Ania i Wojtek zbierają jabłka u sadownika. Mają uzbierać wspólnie 60 kg, co według pracodawcy odpowiada 300 jabłkom stosownej wielkości. Przynoszą je partiami, po kilkanaście albo kilkadziesiąt sztuk. Program ma pytać o kolejne partie tak długo, aż suma wyniesie 300 lub więcej.

1. Ustaw wartość sumy na 0. 2. Powtarzaj kroki 3 i 4, dopóki suma jest liczbą mniejszą niż 300. 3. Zapytaj o liczbę przyniesionych jabłek. Zapamiętaj tę liczbę. 4. Dodaj zapamiętaną liczbę do sumy. 5. Wypisz informację, że liczba jabłek jest wystarczająca. powtarzaj
Podręcznik Informatyka na czasie 2, s. 99–100 (6.3 Tworzymy własne programy użytkowe, opis zadania, ramka „Specyfikacja”, lista kroków)
Część 1 · Symulacja

Sprawdzamy algorytm na kartce

Zanim napiszemy kod, przechodzimy algorytm ręcznie. Każdy wiersz to jedno podejście z jabłkami. „NIE” w ostatniej kolumnie oznacza, że warunek przestał być prawdziwy i algorytm przechodzi do kroku 5.

Liczba jabłek przy bieżącym podejściuSuma jabłekCzy wartość sumy jest mniejsza niż 300?
0TAK
5555TAK
51106TAK
63159TAK
55214TAK
52266TAK
50316NIE
Podręcznik Informatyka na czasie 2, s. 100 (6.3 Tworzymy własne programy użytkowe, tabela 6.2 „Symulacja algorytmu Zbiór jabłek”)
Część 2 · Znajdź błąd

Ten kod nie ruszy

Tak wygląda program „Zbiór jabłek” wydrukowany w podręczniku na stronie 100. Przepisany dosłownie nie da się uruchomić: jedna linijka ma usterkę.

1. total = 0
2. while total < 300:
3.     count = int(input("Ile jabłek przynieśliście? ")
4.     total += count
5. print("Brawo! Uzbieraliście wymaganą liczbę jabłek. ")

Która to linijka i czego w niej brakuje?

Podręcznik Informatyka na czasie 2, s. 100 (6.3 Tworzymy własne programy użytkowe, kod źródłowy programu „Zbiór jabłek”)
Część 2 · Wersja, która działa

Poprawiony kod i jego przebieg

1. total = 0
2. while total < 300:
3.     count = int(input("Ile jabłek przynieśliście? "))
4.     total += count
5. print("Brawo! Uzbieraliście wymaganą liczbę jabłek. ")
Ile jabłek przynieśliście? 65
Ile jabłek przynieśliście? 71
Ile jabłek przynieśliście? 73
Ile jabłek przynieśliście? 75
Ile jabłek przynieśliście? 70
Brawo! Uzbieraliście wymaganą liczbę jabłek.
>>>

Zapis total += count z linijki 4. znaczy: weź poprzednią wartość zmiennej total, zwiększ ją o aktualną wartość zmiennej count i tę sumę zapamiętaj jako nową wartość zmiennej total. Tekst pytania jest w środku input, więc kursor czeka zaraz za znakiem zapytania.

Podręcznik Informatyka na czasie 2, s. 100–101 (6.3 Tworzymy własne programy użytkowe, kod źródłowy i rys. 6.6 „Przykładowy przebieg działania programu Zbiór jabłek”) · poprawiony listing, w podręczniku brak nawiasu
Część 2 · Pętla while

Powtarzaj, dopóki warunek jest prawdziwy

total = 0 total < 300 ? NIE wypisz komunikat i zakończ program TAK zapytaj o jabłka, dodaj do sumy

Schemat ogólny: while warunek:, a pod spodem instrukcje z wcięciem. Wszystkie instrukcje za dwukropkiem i wyróżnione wcięciem będą powtarzane tak długo, dopóki warunek jest prawdziwy.

Podręcznik Informatyka na czasie 2, s. 101 (6.3 Tworzymy własne programy użytkowe, budowa pętli while) i s. 225 (dodatek 7 Podstawowe typy instrukcji, składnia while)
Część 2 · Kiedy pętla się nie kończy

Warunek musi kiedyś przestać być prawdziwy

Pętli while używamy wtedy, gdy nie znamy z góry liczby powtórzeń. O programie mówimy, że się „zapętlił”, gdy przez błąd wykonuje instrukcje pętli w nieskończoność.

Pętla, która się kończy suma: 0, 55, 106, 159, 214, 266, 316 warunek 316 < 300 jest fałszywy program przechodzi dalej Pętla, która się zapętliła suma: 0, 0, 0, 0, 0, 0, 0 ktoś zapomniał o linijce 4. program nie skończy się nigdy

Ciekawostka: nie da się napisać programu, który dla dowolnego innego programu z góry odpowie, czy ten się zatrzyma. To problem stopu, a Alan Turing udowodnił w 1937 roku, że ogólnego rozwiązania nie ma.

Podręcznik Informatyka na czasie 2, s. 100 (6.3, ramka „Warto wiedzieć” o zapętleniu) i s. 225 (dodatek 7, kiedy stosuje się while) · ciekawostka: en.wikipedia.org/wiki/Halting_problem
Część 3 · Drugi przykład

Ta sama pętla, inne zadanie

name = "Joanna"
guess = ""
i = 0

print("Spróbuj odgadnąć moje imię")
while guess != name:
    i = i + 1
    print("Próba", i, ": ", end="")
    guess = input()

print("Brawo! Udało ci się odgadnąć moje imię za", i, "razem.")

Tu też nie wiadomo z góry, ile będzie powtórzeń: pętla działa, dopóki wpisana próba różni się od szukanego imienia.

Operatory przydatne w zadaniach:

!= jest różne od

** potęgowanie: 2 ** 3 daje 8

// dzielenie całkowite: 3 // 2 daje 1

% reszta z dzielenia: 3 % 2 daje 1

Podręcznik Informatyka na czasie 2, s. 225 (dodatek 7 Podstawowe typy instrukcji, przykład użycia pętli while) i s. 227 (dodatek 8 Operatory i funkcje matematyczne, operatory arytmetyczne)
Ćwiczenie · na kartce · 12 minut

Ćwiczenie: tabela i własne zadanie

  1. Podpisz kartkę. Przepisz tabelę z prawej i uzupełnij ją dla partii jabłek: 70, 80, 65, 90.
  2. Wybierz jedno zadanie ze strony 102: 2. imię i ulubiony kolor, 3. czy dwie liczby są różne, 4. wartość pieniędzy w skarbonce.
  3. Zapisz dla niego listę kroków (3 do 5) i szkic kodu (3 do 6 linijek). Nazwy zmiennych bez polskich znaków.
Jabłek | Suma | Suma < 300 ?
   –   |  0   |
       |      |
       |      |
       |      |
       |      |
Podręcznik Informatyka na czasie 2, s. 101 (ćwiczenie 5) i s. 102 (Zadania 2., 3., 4., poziom jednej gwiazdki) · wzór tabeli: tab. 6.2 ze s. 100
Część 3 · Pytania kontrolne

Trzy pytania na koniec

  1. Instrukcja if i pętla while mają warunek. Czym się w takim razie różnią?
  2. Co stanie się z programem, gdy warunek pętli while nigdy nie przestanie być prawdziwy?
  3. Zapis total += count da się rozpisać dłużej. Jak?
Podręcznik Informatyka na czasie 2, s. 99–101 (6.3 Tworzymy własne programy użytkowe, ramka „Zapamiętaj”)
Część 3 · Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Pętla kończy się, gdy suma sięgnie 300Serwery i gry mają pętlę, która ma się nie kończyć: czeka na kolejne żądanie albo klatkę obrazu. W Pythonie to pętla zdarzeń, a uruchamia ją run_forever.nadal w użyciu
Zmienne śledzone ręcznie w tabeliProgram zatrzymuje się w wybranej linijce, a wartości zmiennych widać na ekranie. Robi to debuger w edytorze.narzędzia
Brak nawiasu widać przy uruchomieniuEdytor sprawdza składnię w tle i podkreśla brakujący nawias przed uruchomieniem.narzędzia
while jako sposób na powtarzanieGdy liczba powtórzeń jest znana, używa się pętli for. while zostaje tam, gdzie tej liczby nie znamy.rozszerzane
Zapętlony program zatrzymuje człowiekDo zadań dokłada się limit czasu i licznik prób, żeby zadanie samo się przerwało.rozszerzane
run_forever: docs.python.org/3/library/asyncio-eventloop.html · opis pętli while: docs.python.org/3/reference/compound_stmts.html