Zadania - pętle

Zadania - pętle
Photo by La-Rel Easter / Unsplash

Tutaj zaprezentuje moje rozwiązanie dotyczące zadań w których mieliśmy przećwiczyć pętle for. Dostaliśmy trzy zadania - jeden z wykorzystaniem modułu turtle, drugie z czytaniem logów i trzecie dla chętnych czyli napisanie znienawidzonego przeze mnie ciągu Fibonacciego 🙂 Ale do dzieła.

Pierwsze zadanie - rysowanie

Z pomocą modułu turtle mieliśmy stworzyć dwa rysunki:

Oto moje rozwiązanie:

Schodki

import turtle

t = turtle.Turtle()
t.speed(3)

rozmiar = 20  
liczba_stopni = 4

for i in range(1, liczba_stopni + 1):
    szerokosc = rozmiar 
    wysokosc = rozmiar * i
    
    for _ in range(2):
        t.forward(szerokosc)
        t.left(90)
        t.forward(wysokosc)
        t.left(90)
        
    t.forward(szerokosc)
    
t.hideturtle()
turtle.exitonclick()

Program zaczynamy od zaimportowania modułu turtle czyli rysującego żółwika. Tworzę obiekt t, który będzie naszym rysownikiem (tudzież żółwikiem). Nazwa krótka, bo jestem leniwa i nie chciałoby mi się powtarzać dłuższej nazwy 😊 (w tym wypadku mogłam sobie na to pozwolić). Potem ustaliłam prędkość rysowania i przeszłam do ustalenia parametrów.

Zmienne rozmiar i liczba_stopni ustaliłam "na sztywno", ale równie dobrze można byłoby poprosić użytkownika o ich wpisanie. Ustaliłam, że rozmiar = 20 czyli bok pojedynczej ściany ma długość 20 jednostek. Schodków ma być 4 żeby spełnić warunki zadania, więc wpisałam 4.

Teraz przechodzimy do głównego kodu. Pętla for przechodzi przez "stopnie" a funkcja range ograniczy nam jej wykonywanie. Warto wiedzieć, że funkcja range działa na zakresach i kończy się przed ostatnim numerem, dlatego jako punkt początkowy ustaliłam 1 a punktem końcowym liczba_stopni + 1. Bez "+1" instrukcja zatrzymałaby się po 3 schodku (równie dobrze mogłabym wpisać for i in range(1, 5) i wyszłoby na to samo, ale to mniej elastyczne i chce pokazać, że potencjalnie wiem co robię i rozumiem działanie 😆).

Ze względu na fakt, że każdy kolejny schodek jest większy od kolejnego o ten początkowy kwadrat ustaliłam stałą szerokość (czyli ten rozmiar) i wysokość zmieniającą się z każdą kolejną iteracją (czyli rozmiar * i). Żółwik rysuje prostokąt zgodnie z instrukcją w zagnieżdżonej pętli (2 razy: bok, zakręt, i*bok, zakręt) a potem przesuwa się na punkt "startowy" o szerokość by móc narysować kolejny prostokąt.

Program zakończy się w momencie spełnienia wszystkich warunków, czyli narysowaniu wszystkich 4 "stopni" i poczeka na kliknięcie myszką aby zamknąć okno. Tyle 😊

Kwadraty w kwadratach

import turtle

t = turtle.Turtle()
t.speed(3)

rozmiar = 20  
ilosc_kwadratow = 8

for i in range(ilosc_kwadratow):
    
    for _ in range(4):
        t.forward(rozmiar)
        t.left(90)
    
    rozmiar += 10

t.hideturtle()
turtle.exitonclick()

Tutaj sytuacja początkowa wygląda podobnie jak w poprzednim programie. Importujemy turtle, tworzymy żółwika (znowu t bo czemu nie), ustawiamy prędkość rysowania i wartości początkowe: rozmiar pierwszego kwadratu i ilość (naliczyłam 8). Oczywiście możemy też dać możliwość użytkownikowi na ustalenie wartości, ale tutaj to nie ma znaczenia. Przejdźmy zatem do kodu właściwego!

Od razu można zauważyć jedną rzecz - dlaczego w poprzednim programie liczba_stopni + 1 a tutaj jest for i in range(ilosc_kwadratow)? Otóż, w poprzednim programie ustaliłam punkt początkowy 1 (było to potrzebne, bo mnożyłam rozmiar przy wysokości, przy 0 nic by nie wyszło), tutaj takiego punktu nie potrzebuję. Rozmiar jest zwiększony niezależnie od indeksu i. Więc ustalając ilosc_kwadratow = 8, dzięki indeksowaniu od zera pętla wykona się dokładnie 8 razy i otrzymam 8 kwadratów. Tak więc tutaj nie musimy dopisać +1 😊

Dalej rysuje się kwadrat, czyli zagnieżdżona pętla for. Pierwszy kwadrat będzie mieć rozmiar 20, bo tak zostało ustalone na początku, następnie po wykonaniu instrukcji rozmiar zostaje zwiększony o 10 jednostek i instrukcja rysowania zostaje wykonana ponownie aż do momentu wykonania instrukcji 8 razy. Ponieważ kwadraty mają mieć wspólną podstawę i lewy bok nie muszę też żółwika nigdzie przestawiać, może zostać w lewym dolnym narożniku. Następnie żółw się chowa a program czeka na kliknięcie myszką aby zamknąć okno. I tyle!

Czytanie logów

logi = [
    ["[2025-03-25T10:41:50] [WARN] Ciepło tutaj..."],
    ["[2025-03-25T11:58:50] [INFO] Cośtam liczę."],
    ["[2025-04-25T20:18:51] [INFO] Zadanie wykonane."],
    ["[2025-05-25T21:12:52] [ERROR] Bzzzztttt... dzielisz przez zero."],
    ["[2025-05-25T22:48:50] [INFO] Plik przetworzony."],
    ["[2025-06-25T01:48:50] [INFO] Połączona z serwisem www."],
    ["[2025-06-25T05:48:22] [ERROR] Booom... i wybuchło..."],
    ["[2025-06-25T15:48:31] [WARN] Miejsce na dysku się kończy."],
    ["[2025-07-25T20:48:50] [ERROR] Zły format pliku."],
    ["[2025-07-25T21:48:32] [INFO] Przesyłka gotowa."],
    ["[2025-07-25T22:21:50] [INFO] Program ściągnięty."],
    ["[2025-07-25T25:48:50] [INFO] A ja liczę i liczę...."],
]

for wpis in logi:
    tekst = wpis[0]
    data = tekst[1:11]
    miesiac = data[5:7]

    if miesiac == "06" and "[ERROR]" in tekst:
        print(tekst)

Co tutaj się zadziało to ja sama nie wiem, ale spróbuję wyjaśnić 😁

Mamy listę z wpisami, która dostała nazwę logi i musimy wyciągnąć z niej wpis z czerwca z komunikatem ERROR. Na szczęście wpisów jest tylko 12 i wszystkie mają podobną strukturę więc zdecydowałam się na zabawę w liczenie, bo inne sposoby nie były dla mnie satysfakcjonujące 😅

Najpierw utworzyłam pętlę for wpis in logi żeby mieć punkt odniesienia. W tym momencie każda pozycja na liście logi jest zapisana pod zmienną wpis. Wspomnę, że każdy z tych elementów jest jednoelementową listą, więc wpis[0] to cały log w formie długiego jednego stringa. Następnie tworzę zmienną tekst i przypisuję jej właśnie ten log, czyli wpis[0]. Następnie ustalam zmienną data, na szczęście wszystkie mają taki sam format. Pomijam indeks 0 (bo nie potrzebuję odwoływać się do nawiasu "[" ) i przechodzę od razu do samej daty (stąd zakres [1:11], data ma 10 znaków). Z tej daty wyciągam sam miesiąc pod zmienną miesiac (czyli zakres [5:7]) i takim oto sposobem mogę w łatwy sposób wyszukać dowolny komunikat z dowolnego miesiąca i go wydrukować. Czy to profesjonalne? I don't think so. Ale na stan mojej obecnej wiedzy pythonowej na nic więcej mnie nie stać 😎

Ciąg Fibonacciego - dla chętnych

Czym w ogóle jest ciąg Fibonacciego? czymś, czym nauczyciele gnębią swoich uczniów, którzy tylko chcą się nauczyć jak programować 😊 Żartuuuuje. To zadanie nie jest aż takie złe.

Celem zadania było napisanie programu, który obliczy ciąg Fibonacciego do wyznaczonej przez użytkownika wartości. Każda kolejna liczba ciągu to suma dwóch poprzednich... pozycji.

Można to zrobić z pętlą while której jeszcze nie było, można z listami, można z pętlą for... Nie chciałam wymyślać koła na nowo, ale większość z kodów które widziałam nie były odpowiednie i bazowały na rzeczach których jeszcze na zajęciach nie mieliśmy. Ostatecznie wyszło mi coś takiego:

maks = int(input("Podaj maksymalną wartość dla tego ciągu: "))

ciag = [0, 1]

for i in range(50):
    nast = ciag[-1] + ciag [-2]
    if nast > maks:
        break
    ciag.append(nast)

print("Ciag Fibonacciego: ")
for liczba in ciag:
    print(liczba)

Co tutaj się dzieje?

Ustalam zmienną maks która przechowuje wpisaną przez użytkownika wartość. Następnie ustalam "punkt początkowy" ciągu poprzez utworzenie listy ciag = [0, 1] żeby spełnić warunek rozpoczęcia ciągu od 0. Dalej tworzę pętlę for i in range(50), która będzie wykonywać swoją instrukcję maksymalnie 50 razy. Jest to zabezpieczenie żeby nie generować liczb w nieskończoność.

W pętli for utworzyłam zmienną nast jako "następna liczba", która dodaje do siebie dwa ostatnie elementy z listy. Następnie ta liczba jest porównywana z wartością podaną przez użytkownika przy pomocy instrukcji if. Jeżeli nowo utworzona liczba przekroczy wartość wpisaną przez użytkownika pętla jest przerwana (stąd instrukcja break). Jeżeli nie, następuje kolejna iteracja a wynik zostaje dopisany do listy poprzez instrukcję ciag.append(nast). Przy czym jeżeli iteracji będzie więcej niż 50 to program, nawet jeżeli nast będzie mniejsze od maks, zostanie przerwany. Na końcu drukujemy wszystkie liczby z listy. Koniec.

Ale drobna uwaga! Na początku moja zmienna maks była zmienną max, bo nie pomyślałam o tym, że to nazwa która jest wbudowana w Pythonie. Czy coś mi to tutaj zmieniało? Nie, bo program i tak działał jak trzeba. ALE! Gdyby to był poważny program to mógłby powstać duży konflikt.

To by było na tyle!

Dziękuję za doczytanie do końca 😊