Pętle w Pythonie

Po siedmiu częściach tutoriali z programowania w Pythonie w końcu zaczyna się prawdziwe programowanie;)

Żeby nie było – wcale nie budowałem napięcia, uważam, że podstawy podane w poprzednich wpisach na prawdę się przydadzą i pomogą w dalszej nauce Pythona.

Uwaga!

Od tego odcinka przestaję podawać kod w stylu IDLE (z „>>> ” na początku linii z kodem). Zakładam już, że po tych kliku odcinkach rozróżniacie linie kodu od np. wyników printa). Dzięki temu łatwiej też skopiować sobie kod
i wkleić do IDLE czy PyCharma.

Czym są te magiczne pętle?

Otóż pętle, to takie konstrukcje w języku programowania, które pozwalają powtarzać te same instrukcje wiele razy. Na przykład jeżeli mamy listę z cenami w PLN i chcielibyśmy je przeliczyć na EUR. Bez użycia pętli trzeba przeliczyć każdy element listy „ręcznie”:

przelicznik = 0.22
# podajemy ceny w PLN
ceny = [12, 5.5, 18]
# tworzymy pustą tablicę na nowe ceny
nowe_ceny = []
# przeliczamy każdy element mnożąc przez przelicznik PLN->EUR
nowe_ceny[0] = ceny[0] * przelicznik
nowe_ceny[1] = ceny[1] * przelicznik
nowe_ceny[2] = ceny[2] * przelicznik
print(nowe_ceny)
[2.64, 1.21, 3.96]

Ok, ceny przeliczone, wszystko się zgadza. A co jeśli mamy hurtownię i będziemy mieli 10, 100, 100000 cen do przeliczenia?

Pętla for

Pierwszym z typów pętli jest pętla for – świetnie nadaje się ona do obrabiania list i innych typów danych o z góry określonym rozmiarze. Jak na przykład lista z wcześniejszego akapitu:

przelicznik = 0.22
ceny = [12, 5.5, 18]
# tworzymy pustą tablicę na nowe ceny
nowe_ceny = []
for x in ceny:
    nowe_ceny.append(x * przelicznik)
    
print(nowe_ceny)
[2.64, 1.21, 3.96]

Czyli przechodzimy od pierwszego elementu przez całą listę ceny, aktualny element umieszczamy w zmiennej x i wykonujemy z nim instrukcje do końca bloku (pamiętajmy, że w Pythonie decydują o tym wcięcia, nie ma średników i nawiasów klamrowych – działanie for kończy się razem z wcięciem 🙂

Powyższy for możemy rozpisać tak:

  • weź pierwszy element ceny i zapisz go w x (teraz x = 12)
  • Dodaj cenę pomnożoną przez przelicznik (x * przelicznik) do listy nowe_ceny (teraz nowe_ceny[0] = 12 * 0.22)
  • jeżeli jest kolejny element na liście to znowu zapisz go w x (teraz x = 5.5)
  • Dodaj cenę pomnożoną przez przelicznik (x * przelicznik) do listy nowe_ceny (teraz nowe_ceny[1] = 5.5 * 0.22)
  • jeżeli jest kolejny element na liście to znowu zapisz go w x (teraz x = 18)
  • Dodaj cenę pomnożoną przez przelicznik (x * przelicznik) do listy nowe_ceny (teraz nowe_ceny[2] = 18 * 0.22)
  • jeżeli jest kolejny element na liście to znowu zapisz go w x – nie ma kolejnego elementu, kończymy pętlę.

Range – jeżeli chcielibyśmy wykonać coś po prostu x razy

Listy listami – a co jeżeli chcielibyśmy na przykład zapytać użytkownika o 3 liczby? Z pomocą przychodzi funkcja range(), która zwraca nam kolejne liczby z zadanego przedziału. Przy czym można ją wywołać na dwa sposoby:

  • range(x) – zwróci nam liczby od 0 do x-1
  • range(x, y) – zwróci nam liczby od x do y-1
  • range(x, y, z) – zwróci nam liczby od x do y-1 z odstępem z

Przykłady:

# range(x) z jednym parametrem
for liczba in range(5):
    print(liczba)
0
1
2
3
4
# range(x,y)
for liczba in range(5,11):
    print(liczba)
5
6
7
8
9
10
# range(x,y,z)
for liczba in range(5,20,3):
    print(liczba)
5
8
11
14
17

A czy range() może zwrócić listę w odwróconej kolejności? Może – dalej jest to od-do, ale trzeci parametr podajemy ujemny:

for liczba in range(10,0,-2):
    print(liczba)
10
8
6
4
2

Oprócz odliczania możemy na przykład użyć tej pętli do pobrania od użytkownika określonej liczby danych. Przy okazji jest sposobność użycia wiedzy zdobytej w poprzednich rozdziałach – dodaję stosowne przypomnienia w komenatrzach:

# tworzymy pustą listę na imiona
imiona = []
print("Podaj 3 imiona:")
# tworzymy pętlę - 3 razy zapytamy o kolejne imię - range(3) daje nam 0, 1, 2
for nr_imienia in range(3):
    # do listy imiona dodajemy wynik funkcji input (a ta przy zapytaniu
    # wyświetla podaną kombinację imienia oraz aktualnego numeru
    imiona.append(input("Imię " + str(nr_imienia) + ": "))
# wyświetlamy wypełnioną listę
print(imiona)
Podaj 3 imiona:
Imię 0: Zenek
Imię 1: Aldona
Imię 2: Karyna
['Zenek', 'Aldona', 'Karyna']

Pętla while

Innym typem pętli w Pythonie jest pętla while – od for różni się tym, że nie musimy znać ilości powtórzeń. Instrukcje w niej zawarte będą się wykonywały dopóki będzie spełniony określony przez nas warunek podany zaraz po instrukcji (lub zostanie przerwana za pomocą break – o czym napiszę dalej):

Przykład 1 – wykonuj pętlę tak długo jak wynik porównania będzie prawdziwy:

a = 0
# powtarzaj pętlę dopóki a jest mniejsze od 5 (a < 5 daje True jeżeli prawdziwe)
while a < 5:
    print(a)
    a = a + 1
0
1
2
3
4

Przykład 2 – wykonuj pętlę dopóki zmienna petla_aktywna jest True:

petla_aktywna = True
licznik = 0
while petla_aktywna:
    if licznik >= 5:
        petla_aktywna = False
    else:
        print(licznik)
    licznik = licznik + 1
0
1
2
3
4

Break i continue

Tymi instrukcjami możemy modyfikować bieg pętli:

  • break – przerywa pętlę całkowicie (pętlę, nie cały program – instrukcje znajdujące się po pętli zostaną wykonane)
  • continue – przerywa aktualny przebieg pętli i zaczyna kolejną (jeżeli aktualna nie była ostatnią)

Przykład zastosowania obu powyższych instrukcji:

imiona = []
imie = ''
print('Podaj imiona (napisz koniec, żeby przerwać:')
while imie != 'koniec':
    imie = input('Imię: ')
    # jeżeli imię = koniec, to wywołujemy instrukcję break
    # i wychodzimy z pętli
    if imie == 'koniec':
        break
    # jeżeli chcemy przerwać tylko aktualną pętlę
    # i zacząć kolejną od nowa - używamy continue
    if imie == 'Juzef':
        print('Serio? Podaj poprawne')
        continue
    imiona.append(imie)

print(imiona)

Program będzie pytał o imię dopóki użytkownik nie wpisze koniec – jeżeli tak się stanie – pętla zostanie przerwana za pomocą komendy break, a program będzie kontynuowany od miejsca za pętlą (wiersz 16 kodu (a nawet 17:)).

Drugą modyfikacją biegu pętli będzie prośba o poprawienie błędnie wpisanego imienia Józef. Jeżeli użytkownik wpisze przez u zamiast ó – zostanie wyświetlona prośba o poprawkę i program po komendzie continue wróci do początku pętli:

Podaj imiona (napisz koniec, żeby przerwać:
Imię: Heniek
Imię: Zenek
Imię: Juzef
Serio? Podaj poprawne
Imię: Józef
Imię: koniec
['Heniek', 'Zenek', 'Józef']

Tak dla całkowitej jasności obrazkiem się posłużę – niebieskie linie pokazują dokąd zaprowadzą na break i continue. Zieloną linią otoczyłem ciało pętli.

Instrukcji tych możemy używać w obu rodzajach pętli.

Pass

Instrukcja, która właściwie nic nie robi. Bardziej jako ciekawostkę umieszczam – czasami jest tak, że coś musimy w kodzie umieścić zanim napiszemy następną instrukcję. Na przykład chcemy zadeklarować pustą pętlę – taką na przyszłość, żeby wiedzieć gdzie ją chcemy mieć, chociaż jej kodu jeszcze nie napisaliśmy. W C++ czy Javie można było wstawić po prostu { } i po temacie, ale nie w Pythonie:)

Jeżeli napiszemy pierwszy wiersz pętli i nie będzie pod nią żadnej instrukcji – Python zwróci nam błąd. Ale jak pod spodem damy samo pass – program się uruchomi choć nic się w tej pętli nie zadzieje.

Pętle zagnieżdżone

Tak jest – pętle można zagnieżdżać. Przydaje się to na przykład przy pracy z dwuwymiarowymi listami.

Tutaj mamy dwuwymiarową listę – liczby są zapisane parami, a my wyłuskamy z niej pojedyncze elementy:

lista = [[1,2],[3,4],[5,6],[7,8],[9,0]]

print("Przed wyłuskaniem:")
print(lista)

print("Po wyłuskaniu:")
for x in lista:
    for y in x:
        print(y)
Przed wyłuskaniem:
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
Po wyłuskaniu:
1
2
3
4
5
6
7
8
9
0

Pythonotka z tego odcinka:

Fiu fiu, ale się napisałem dzisiaj. Mam nadzieję, że wszystkie najważniejsze informacje dotyczące pętli w Pythonie zamieściłem. A jak nie zamieściłem, to z pewnością zrobię aktualizację:)

Nie bądź lama, udostępnij;)