PYTHON Pętle zagnieżdżone
Pętle zagnieżdżone to takie, gdzie wewnątrz jednej pętli znajduje się kolejna. Pętle zagnieżdżać można dowolnie – wewnątrz pętli while może znajdować się zarówno pętla while, jak i for, podobnie z pętlą for.
Prześledźmy to na prostym przykładzie:
x = 3 y = 4 z = y while x > 0 : while z > 0 : print(x,"|",z) z = z - 1 z = y x = x - 1
Wnętrze zewnętrznej pętli while oddalone jest od lewej strony na 1 tabulator, wewnętrznej na 2 tabulatory.
Zewnętrzna pętla operuje na zmiennej x, która początkowo ma wartość 3, następnie z każdym obiegiem jest mniejsza o 1, aż do osiągnięcia wartości 1.
Wewnętrzna pętla operuje na zmiennej z, która za początkową wartość przyjmuje wartość y, czyli 4, w każdym obiegu pętli zmniejsza się o 1, aż do 1.
Wypisanie na ekran następuje w wewnętrznej pętli, a wypisywane są pary wartości x oraz z.
- Następuje pierwszy obieg zewnętrznej pętli – wartość x = 3
- Rozpoczyna się wewnętrzna pętla, wartość z = 4
- Wypisanie na ekran 3 | 4
- Kolejny obieg wewnętrznej pętli, wypisanie na ekran 3 | 3
- itd…
Efekt:
3 | 4 3 | 3 3 | 2 3 | 1 2 | 4 2 | 3 2 | 2 2 | 1 1 | 4 1 | 3 1 | 2 1 | 1
Przejdźmy do konkretniejszych przykładów – za pomocą zagnieżdżonych pętli while oraz for zrobimy sprawdzenie, czy liczby z zadanego przedziału są liczbami pierwszymi.
Jednak żeby zacząć, musimy opracować program, który sprawdzi nam, czy zadana pojedyncza liczba jest liczbą pierwszą.
while
liczba_do_sprawdzenia = 13 aktualny_dzielnik = 2 czy_pierwsza = True while aktualny_dzielnik < liczba_do_sprawdzenia : if liczba_do_sprawdzenia%aktualny_dzielnik == 0 : czy_pierwsza = False break aktualny_dzielnik += 1 if czy_pierwsza == True : print(liczba_do_sprawdzenia,"jest liczbą pierwszą")
Liczba do sprawdzenia: 13, startowy dzielnik: 2, w każdym obiegu pętli będziemy go zwiększać, aż do uzyskania 12. Jeśli liczba nie podzieli się bez przez żaden z kolejnych dzielników, znaczy, że mamy do czynienia z liczbą pierwszą.
Przejdźmy zatem do rozszerzenia naszego programu o sprawdzenie wielu liczb naraz, np. z zakresu 10 – 100:
zakres_od = 10 zakres_do = 100 liczba_do_sprawdzenia = zakres_od while liczba_do_sprawdzenia <= zakres_do : aktualny_dzielnik = 2 czy_pierwsza = True while aktualny_dzielnik < liczba_do_sprawdzenia : if liczba_do_sprawdzenia%aktualny_dzielnik == 0 : czy_pierwsza = False break aktualny_dzielnik += 1 if czy_pierwsza == True : print(liczba_do_sprawdzenia,"jest liczbą pierwszą") liczba_do_sprawdzenia += 1
Do poprzedniej wersji programu dodaliśmy zakres od i zakres do, natomiast aktualną liczbę do sprawdzenia ustawiliśmy na tę samą wartość co zakres od. Pętla zewnętrzna przechodzi kolejno po liczbach z zakresu, pętla wewnętrzna sprawdza czy liczba jest liczbą pierwszą.
for
Wersja dla pojedynczej wartości:
liczba_do_sprawdzenia = 13 startowy_dzielnik = 2 czy_pierwsza = True for aktualny_dzielnik in range(startowy_dzielnik,liczba_do_sprawdzenia) : if liczba_do_sprawdzenia%aktualny_dzielnik == 0 : czy_pierwsza = False break if czy_pierwsza == True : print(liczba_do_sprawdzenia,"jest liczbą pierwszą")
Oraz dla liczb z zakresu:
zakres_od = 10 zakres_do = 100 liczba_do_sprawdzenia = zakres_od for liczba_do_sprawdzenia in range(zakres_od,zakres_do+1) : startowy_dzielnik = 2 czy_pierwsza = True for aktualny_dzielnik in range(startowy_dzielnik,liczba_do_sprawdzenia) : if liczba_do_sprawdzenia%aktualny_dzielnik == 0 : czy_pierwsza = False break if czy_pierwsza == True : print(liczba_do_sprawdzenia,"jest liczbą pierwszą")