Blog JSystems - z miłości do programowania

Pętle



Pętle służą do wielokrotnego wykonywania jakiejś czynności. Jeśli wiemy ile razy dana czynność ma być wykonana, stosujemy pętlę "for". Jeśli zamierzamy wykonywać jakąś czynność aż do skutku (np. czytanie pliku aż się skończą dane), stosujemy pętlę "while".


 


Pętla while


Pętla while będzie wykonywana tak długo, jak długo określony warunek jest prawdziwy. Poniższa pętla będzie się wykonywała tak długo, jak długo warunek x<=10 jest prawdziwy. W chwili gdy warunek przestaje być prawdziwy, pętla jest przerywana. Zmienną użytą w warunku musiałem osobno zadeklarować. Tworząc tego typu pętle należy pamiętać by warunek miał szansę przestać być spełniony, bo jeśli o to nie zadbamy pętla będzie się wykonywała w nieskończoność. Z tego powodu po wypisaniu aktualnej wartości zmiennej x, zwiększam ją o jeden przy każdym "obrocie" pętli. Zapis x+=1 znaczy tyle co x=x+1, ale jest po prostu krótszy.


x=1
while(x<=10):
    print(x)
    x+=1


 


Pętla for


Pętla for będzie wykonywana tyle razy ile określimy poprzez zakres zmiennej. Myślę że najlepiej będzie to zobrazować przykładem.


for x in range(1,11):
    print(x)


W powyższej pętli for niejawnie deklarowana jest zmienna x, która jest widoczna tylko w ramach pętli. Służy ona do iteracji. Jej wartość rośnie przy każdym obrocie pętli w zakresie od 1 do 10. Do 10 a nie 11? Tak właśnie, ponieważ jest to zakres niedomknięty z prawej strony. Na konsoli zostają wypisane wartości od 1 do 10.  Funkcja range będąca podstawą tej pętli może też przyjąć trzeci argument, określający o ile ma się zwiększać nasz iterator przy każdym obrocie pętli.


for x in range(1,11,2):
    print(x)


Po uruchomieniu powyższej pętli, na konsoli zostanie wypisana co druga wartość w zakresie 1-10, a więc 1,3,5,7,9.


Ten trzeci argument może być również liczbą ujemną, gdy chcemy by wartość naszego iteratora malała. Tym razem jednak muszę odwrócić pierwsze dwa argumenty. O ile przy rosnącym iteratorze pierwsza wartość musi być mniejsza od drugiej, o tyle przy malejącym dokładnie odwrotnie. Pamiętaj o zakresie niedomkniętym z prawej strony. Poniższa pętla wyświetla wartości od 10 do 1 na konsoli:


for x in range(10,0,-1):
    print(x)


 


Zagnieżdżanie pętli


Pętle można zagnieżdżać jedna w drugiej. Przyjrzyjmy się poniższemu przykładowi:


for y in range(1,11):
    for x in range(1,11):
        print('y={}, x={}'.format(y,x))


Na każdy obrót zewnętrznej pętli przypada pełny cykl obrotów wewnętrznej pętli.  Czyli przy pierwszym obrocie pętli zewnętrznej y jest równy 1, następuje 10 obrotów wewnętrznej pętli. Y wzrasta o 1, następuje pełen cykl obrotów pętli wewnętrznej. Ten proces będzie się powtarzać aż y osiągnie wartość 10.  Początek wyniku działania powyższego kodu dla zobrazowania:


y=1, x=1


y=1, x=2


y=1, x=3


y=1, x=4


y=1, x=5


y=1, x=6


y=1, x=7


y=1, x=8


y=1, x=9


y=1, x=10


y=2, x=1


y=2, x=2


y=2, x=3


y=2, x=4


y=2, x=5


y=2, x=6


y=2, x=7


y=2, x=8


.....


Zagnieżdżać możemy również pętle while. Nic nie stoi też na przeszkodzie by pętlę for zagnieździć w pętli while, ale również odwrotnie. Poniżej dający ten sam efekt co ostatni przykład kod z użyciem dwóch pętli while.


y,x=1,1
while(y<=10):
    x=1
    while(x<=10):
        print('y={}, x={}'.format(y, x))
        x+=1
    y+=1


 


Instrukcja BREAK


Instrukcja "break" służy do przerywana działania pętli. Jak zawsze obraz wart więcej niż 1000 słów:


for x in range(1,101):
    if(x%17.5==0):
        print("szukana liczba to {}".format(x))
        break


Powyższy kod szuka pierwszej liczby z zakresu 1-100 podzielnej przez 17.5. Przeszukujemy zakres liczba po liczbie i sprawdzamy czy reszta z dzielenia tej liczby przez 17.5 wynosi 0. Jeśli tak, to jest to poszukiwana przez nas liczba i można przerwać dalsze poszukiwania z użyciem instrukcji break.


 


Instrukcja CONTINUE


Instrukcja "continue" powoduje przeskok do następnego obrotu pętli. Przykład obrazujący:


for x in range(-10,11):
    if(x==0):
        continue
    print(1/x)


Powyższy kawałek kodu drukuje na konsoli wynik dzielenia 1 przez kolejne wartości z zakresu -10 do 10. W przypadku trafienia na zero, pojawi się wyjątek dzielenia przez zero. Moglibyśmy oczywiście taki wyjątek obsłużyć (tym jak się to robi zajmiemy się nieco później), albo oprzeć wyświetlanie wyniku dzielenia o warunek sprawdzający czy aby x jest na pewno różny od 0. Skorzystałem z instrukcji "continue", która powoduje przeskoczenie dalszych instrukcji w ramach danego obrotu pętli i przejście do kolejnego jej obrotu. W tym przypadku zostala pominięta instrukcja wydruku zawierająca problematyczne dzielenie.


 

Przyjdź do nas na szkolenie z języka Python! Mamy szereg szkoleń w ofercie, od podstawowych po aplikacje webowe z użyciem Django, analizę danych, tesowanie, machine learning i wiele innych.
Sprawdź dostępne szkolenia Python
Zapisz się do newslettera aby otrzymywać najnowsze świeżynki pojawiające się na blogu!