Temat: PYTHON Pętle zagnieżdżone
Pętle zagnieżdżone w Pythonie to konstrukcja, w której jedna pętla jest umieszczona wewnątrz innej pętli. Możemy myśleć o tym jak o pętlach umieszczonych jedna w drugiej, gdzie każda iteracja zewnętrznej pętli może wywoływać wiele iteracji wewnętrznej pętli. Pętle zagnieżdżone mogą być używane zarówno z pętlami for, jak i while, a także w kombinacji obu tych typów.
Główne cechy pętli zagnieżdżonych:
-
Hierarchia Pętli: W zagnieżdżonych pętlach mamy co najmniej dwie pętle: zewnętrzną i wewnętrzną. Pętla wewnętrzna jest wykonywana w całości przy każdej iteracji pętli zewnętrznej.
-
Przetwarzanie wielowymiarowe: Zagnieżdżone pętle są często używane do przetwarzania danych wielowymiarowych, takich jak listy dwuwymiarowe (np. macierze) lub więcej wymiarów.
-
Kontrola Przepływu: Pętla wewnętrzna może mieć własne warunki i sterowanie, niezależne od zewnętrznej pętli, co umożliwia skomplikowane operacje.
-
Efektywność: Choć zagnieżdżone pętle mogą być potężnym narzędziem, mogą także prowadzić do złożoności obliczeniowej, szczególnie w przypadku głębokiego zagnieżdżenia i/lub dużych zbiorów danych.
Przykłady zastosowań:
- Przetwarzanie danych tabelarycznych: Przeszukiwanie, przetwarzanie lub wyświetlanie danych w tabelach lub macierzach.
- Algorytmy numeryczne: W matematyce i fizyce, np. obliczenia na macierzach, transformacje liniowe.
- Gry i symulacje: W programowaniu gier, do iteracji po elementach siatek gier, np. w grach planszowych.
- Algorytmy grafowe: Przeszukiwanie grafów i drzew, gdzie każdy wierzchołek może prowadzić do kolejnych pętli iteracyjnych.
Ważne uwagi:
- Należy zwracać uwagę na efektywność takiego kodu, ponieważ zagnieżdżone pętle mogą szybko zwiększać złożoność obliczeniową programu.
- Czytelność i utrzymanie kodu może być trudniejsze, gdy używamy wielu poziomów zagnieżdżonych pętli.
- W niektórych przypadkach lepszym rozwiązaniem może być użycie innych struktur danych lub algorytmów.
Przykład 1
Załóżmy, że chcemy wydrukować wszystkie możliwe pary liczb od 1 do 3. Poniżej znajdują się przykłady z wykorzystaniem pętli for oraz while.
for
for i in range(1, 4):
for j in range(1, 4):
print(f"Para: {i}, {j}")
-
Zewnętrzna pętla
for i in range(1, 4):- Ta pętla iteruje przez sekwencję liczb od 1 do 3 (włącznie), ponieważ
range(1, 4)generuje liczby 1, 2, 3. - W każdej iteracji, zmienna
iprzyjmuje kolejną wartość z tej sekwencji.
- Ta pętla iteruje przez sekwencję liczb od 1 do 3 (włącznie), ponieważ
-
Wewnętrzna pętla
for j in range(1, 4):- Dla każdej wartości
iz zewnętrznej pętli, ta pętla również iteruje przez sekwencję liczb od 1 do 3. - Zmienna
jprzyjmuje kolejną wartość z tej sekwencji w każdej iteracji wewnętrznej pętli.
- Dla każdej wartości
-
Instrukcja
print(f"Para: {i}, {j}"):- Ta instrukcja jest wykonywana dla każdej kombinacji wartości
iij. - Wypisuje ona parę liczb (i, j), gdzie
ijest wartością z zewnętrznej pętli, ajwartością z wewnętrznej pętli.
- Ta instrukcja jest wykonywana dla każdej kombinacji wartości
while
i = 1
while i < 4:
j = 1
while j < 4:
print(f"Para: {i}, {j}")
j += 1
i += 1
-
Inicjalizacja zmiennej
i:- Skrypt rozpoczyna się od ustawienia
ina 1. Zmiennaibędzie służyć jako pierwszy element każdej pary.
- Skrypt rozpoczyna się od ustawienia
-
Pierwsza pętla
while:- Pętla ta (
while i < 4) będzie kontynuowana dopókiijest mniejsze niż 4. Oznacza to, że pętla wykonuje się dla wartościirównych 1, 2 i 3.
- Pętla ta (
-
Inicjalizacja zmiennej
jwewnątrz pierwszej pętli:- Wewnątrz pętli
whiledlai, zmiennajjest inicjowana jako 1. Zmiennajbędzie służyć jako drugi element każdej pary.
- Wewnątrz pętli
-
Druga pętla
whilewewnątrz pierwszej:- Ta wewnętrzna pętla (
while j < 4) również kontynuuje działanie dopókijjest mniejsze niż 4, co oznacza iterowanie przez wartości 1, 2 i 3.
- Ta wewnętrzna pętla (
-
Instrukcja
printwewnątrz drugiej pętli:- Wewnątrz drugiej pętli
while, instrukcjaprint(f"Para: {i}, {j}")wypisuje aktualną parę wartościiij. - Po wypisaniu pary,
jjest zwiększane o 1 (j += 1), aby przejść do następnej wartości.
- Wewnątrz drugiej pętli
-
Inkrementacja
ipo zakończeniu wewnętrznej pętliwhile:- Po zakończeniu działania wewnętrznej pętli
while, zewnętrzna pętlawhilezwiększa wartośćio 1 (i += 1) i powtarza wewnętrzną pętlę dla nowej wartościi.
- Po zakończeniu działania wewnętrznej pętli
Efektem działania obu skryptów będzie wyświetlenie wszystkich par liczb z zakresu od 1 do 3. Wygląda to następująco:
Para: 1, 1
Para: 1, 2
Para: 1, 3
Para: 2, 1
Para: 2, 2
Para: 2, 3
Para: 3, 1
Para: 3, 2
Para: 3, 3
Przykład 2
Załóżmy, że mamy tabelę (listę list) zawierającą dane o uczniach i ich oceny z różnych przedmiotów. Chcemy przejrzeć wszystkie oceny wszystkich uczniów i wyświetlić te, które są poniżej pewnego progu.
dane_uczniow = [
["Anna", 3, 4, 5],
["Bartek", 2, 4, 3],
["Cezary", 5, 5, 5],
["Dorota", 4, 3, 2]
]
for
for uczen in dane_uczniow:
for ocena in uczen[1:]: # Pomijamy pierwszy element, ponieważ jest to imię
if ocena < 3:
print(f"Uczeń {uczen[0]} ma ocenę poniżej 3: {ocena}")
-
Pętla zewnętrzna
for uczen in dane_uczniow:- Ta pętla iteruje przez każdy element listy
dane_uczniow. - Każdy element listy
dane_uczniowjest również listą, reprezentującą pojedynczego ucznia wraz z jego ocenami. Na przykład, element[“Anna”, 3, 4, 5]reprezentuje ucznia o imieniu Anna, który otrzymał oceny 3, 4 i 5. - W każdej iteracji, zmienna
uczenprzechowuje aktualną listę (uczniów i ich ocen) podczas przechodzenia przez listędane_uczniow.
- Ta pętla iteruje przez każdy element listy
-
Pętla wewnętrzna
for ocena in uczen[1:]:- Ta pętla iteruje przez każdy element listy reprezentującej pojedynczego ucznia, zaczynając od drugiego elementu (indeks 1). Użycie
uczen[1:]oznacza wzięcie "podlisty" od drugiego elementu do końca listy. Pomijamy pierwszy element, ponieważ jest to imię ucznia, a nie ocena. - W każdej iteracji, zmienna
ocenaprzechowuje aktualną ocenę ucznia z listy ocen.
- Ta pętla iteruje przez każdy element listy reprezentującej pojedynczego ucznia, zaczynając od drugiego elementu (indeks 1). Użycie
-
Warunek
if ocena < 3:- Wewnątrz pętli wewnętrznej, mamy warunek sprawdzający, czy aktualna ocena jest mniejsza niż 3.
- Jeśli warunek jest spełniony (czyli ocena jest niższa niż 3), wykonuje się blok kodu wewnątrz instrukcji
if.
-
Instrukcja
print(f"Uczeń {uczen[0]} ma ocenę poniżej 3: {ocena}"):- Ta instrukcja jest wykonana, jeśli warunek
ifjest prawdziwy. - Wyświetla ona informację, którego ucznia dotyczy ocena poniżej 3, wraz z tą oceną.
{uczen[0]}wstawia pierwszy element listyuczen(czyli imię ucznia) do łańcucha znaków.{ocena}wstawia aktualną ocenę poniżej 3 do łańcucha znaków.
- Ta instrukcja jest wykonana, jeśli warunek
while
i = 0
while i < len(dane_uczniow):
uczen = dane_uczniow[i]
j = 1 # Zaczynamy od 1, aby pominąć imię
while j < len(uczen):
ocena = uczen[j]
if ocena < 3:
print(f"Uczeń {uczen[0]} ma ocenę poniżej 3: {ocena}")
j += 1
i += 1
-
Inicjalizacja zmiennej
i:- Zaczynamy od ustawienia zmiennej
ina 0. Ta zmienna służy jako indeks do iterowania przez listędane_uczniow.
- Zaczynamy od ustawienia zmiennej
-
Pierwsza pętla
while:- Pętla ta (
while i < len(dane_uczniow)) będzie kontynuować wykonanie, dopókiijest mniejsze niż liczba elementów w liściedane_uczniow. - W każdej iteracji, zmienna
uczenprzyjmuje wartośćdane_uczniow[i], czyli kolejnego ucznia z listy.
- Pętla ta (
-
Inicjalizacja zmiennej
j:- Wewnątrz pierwszej pętli
while, ustawiamyjna 1, aby zacząć przeglądanie ocen od pierwszego elementu po imieniu (pamiętamy, że indeks 0 w każdej liścieuczento imię).
- Wewnątrz pierwszej pętli
-
Druga pętla
while:- Ta pętla (
while j < len(uczen)) przegląda wszystkie oceny dla danego ucznia. len(uczen)daje nam długość listy ucznia, włączając imię i oceny.
- Ta pętla (
-
Przypisywanie i sprawdzanie ocen:
- W każdej iteracji tej pętli,
ocena = uczen[j]przypisuje aktualną ocenę do zmiennejocena. - Następnie warunek
if ocena < 3sprawdza, czy ta ocena jest mniejsza niż 3.
- W każdej iteracji tej pętli,
-
Drukowanie wyniku:
- Jeśli warunek jest spełniony, wykonywana jest instrukcja
print, która wyświetla imię ucznia i jego niską ocenę.
- Jeśli warunek jest spełniony, wykonywana jest instrukcja
-
Inkrementacja indeksów
jii:- Na końcu każdej iteracji wewnętrznej pętli
while,jjest zwiększane o 1 (j += 1), aby przejść do następnej oceny. - Po zakończeniu wewnętrznej pętli
whiledla danego ucznia, zmiennaijest zwiększana o 1 (i += 1) w zewnętrznej pętliwhile, aby przejść do następnego ucznia w liście.
- Na końcu każdej iteracji wewnętrznej pętli
| Testy przypięte do lekcji | |
|---|---|
| Aby uzyskać dostęp do testów i ćwiczeń interaktywnych - Zaloguj się |