7. Pętle - majsylw/Introduction-to-programming-in-python GitHub Wiki

Programowanie w dużej mierze opiera się na uogólnianiu rozwiązań problemów. A więc uogólniając, naszym zadaniem jest napisać jeden kod, który będzie wstanie rozwiązać jak najwięcej potencjalnych problemów. Za przykład możemy wziąć obliczanie średniej arytmetycznej ocen. Chcemy napisać program, który będzie umiał obliczyć średnią niezależnie od liczby ocen, jaką będzie chciał podać użytkownik. Nie chcemy kodu na sztywno zawsze obliczającego jej z 3 czy 5 liczb, ale z n liczb. Wiąże się z tym zagadnieniem problem powtarzania kodu: możemy napisać 5 razy pod rząd kod, który prosi o podanie liczby przez użytkownika, a następnie dodaje ją do sumy. Jednak jest to dokładnie tym, czego chcemy uniknąć - tutaj z pomocą przychodzą nam pętle. Zanim przejdziemy do średniej, spójrzmy na klasyczny przykład wypisywania kolejnych liczb, od 0 do 4, który pozwoli nam zrozumieć pętle. W języku Python mamy dwa rodzaje pętli: for oraz while.

Pętla while

Pierwszą konstrukcją, którą chcę tutaj przytoczyć jest pętla while. Jej składnia jest następująca:

while warunek:
    instrukcja

Instrukcja zawarta wewnątrz pętli (kod wcięty pod słowem while) będzie wykonywała się tak długi jak warunek będzie spełniony. Oznacza to, że o ile nie chcemy w nieskończoność (bądź nigdy) wykonywać pewnych operacji to potrzebujemy aby zmienna wykorzystana do stworzenia warunku zmieniała swoją wartość w trakcie wykonywania się pętli (w każdym bądź poszczególnych krokach - iteracji). Zobaczmy to na prostym przykładzie:

i = 0
while i < 5:
    print(i, end=' ')
    i += 1
# 0 1 2 3 4

Stworzyliśmy zmienną i wcześniej, przypisując jej wartość 0. Następnie w samej pętli while jest warunek: wykonuj ciało pętli dopóki wartość zmiennej i jest ostro mniejsza od 5 (w matematyce mówimy ostro gdy chcemy podkreślić, że nie dopuszczamy równości). Dopóki więc ten warunek jest spełniony, wykonujemy dwa polecenia: wypisujemy wartość zmiennej i, oraz dodajemy do niej liczbę 1. Oczywiście przy konstruowaniu warunków możemy korzystać z poznanych wcześniej operatorów logicznych i porównania, nie musimy ograniczać się do korzystania tylko z jednej zmiennej. Wewnątrz ciała pętli możemy zawrzeć dowolne instrukcje.

Pętla for

Kolejnym przykładem pętli używanej w języku python jest pętla for. Zobaczmy jej wykorzystanie na powyższym przykładzie:

for i in range(0,5):
    print(i, end=' ')
# 0 1 2 3 4

Taki zapis oznacza, że ciało pętli (wcięte wiersze kodu pod słowem for) będzie wykonywać się 5 razy: za każdym razem wartość zmiennej i będzie różna: najpierw będzie to 0, potem 1, potem 2 i tak aż do 4 włącznie. Tutaj kod nie robi nic poza wypisaniem wartości zmiennej i na ekran. Przyjrzyjmy się dokładnie: pierwszy argument funkcji range() jest podany włącznie (i przyjmie wartość 0), podczas gdy drugi wyłącznie (i nie przyjmie wartości 5, ale jedynie 4). Choć początkowo jest to nieintuicyjne, przekonamy się w przyszłości, że w wielu zastosowaniach takie podejście jest wygodniejsze. Dodatkowo w funkcji range() możemy podać 3 argument, który będzie odpowiadał za długość kroku (czyli co ile będzemy wymieniać nasze liczby, domyślnie jest to 1). w takim przypadku wynikiem wywołania komendy range(0,10,2) będzie utworzenie listy [0,2,4,6,8] (wybieramy liczby od 0 do 10 (wyłącznie) poruszając się co 2 cyfry). Możliwym jest także poruszanie się (iterowanie) po kolejnych elementach listy, na przykład:

for i in ['motor', 'pies', 'kot']:
    print(i)
# motor
# pies
# kot

W powyższym przykładzie zmienna i będzie kolejno przymować wartości wystepujące w liście ['motor', 'pies', 'kot'].

Możemy dostrzec pewne podstawowe różnice pomiędzy pętlami while i for, a mianowicie: w przypadku pętli for z góry podajemy listę wartości jakie ma przyjąć iterator, podczas gdy dla pętli while nie podajemy z góry, jakie wartości ma przyjmować zmienna i, ale za to podajemy warunek logiczny, jak długo pętla ma się wykonywać. Dla pętli while musimy sami zadbać o zmianę wartości w zmiennej i, tak aby ostatecznie warunek stał się fałszywy. Na zmienną, która się zmienia w każdej iteracji pętli, w naszym przypadku i, mówi się zmienna iterująca (lub krócej iterator).

Pozostaje pytanie, którą pętlę wybrać, skoro są one tak bardzo do siebie podobne? Może na tym etapie trudno wyrobić sobie jakąś intuicję, jednak generalna zasada jest następująca: pętli while używa się wtedy, gdy nie jesteśmy w stanie na etapie pisania programu powiedzieć, ile będzie iteracji pętli, gdyż ta liczba jest mocno zależna od danych wejściowych (algorytmy numeryczne, wczytywanie danych z nieznanych źródeł…), podczas gdy pętla for jest używana, gdy możemy powiedzieć, ile będzie iteracji, nawet jeśli ta odpowiedź wynosi “długość tablicy”, albo “wartość zmiennej n”.