🐍Python🐍 zajęcia 6 + update quizu

🐍Python🐍 zajęcia 6 + update quizu
Photo by David Clode / Unsplash

pętle WHILE * ciąg Fibonacciego * błądzenie losowe

!! Uważaj - nie nadawaj zmiennej nazwy "max" - może zostać niewłaściwie zinterpretowana

Pętla while

  • jeśli to prawda, zrób...
i = 5
while i<0:
  print(i)   # wynik: 0 1 2 3 4 
  i += 1
  • Pętla while wykonuje blok kodu tak długo, jak warunek jest prawdziwy (True). Gdy warunek staje się fałszywy (False), pętla się kończy.
  • sposoby zakończenia pętli:
    • i += 1 - zapobiega nieskończonemu wykonywaniu pętli
    • break
    • skrót klawiszowy (np. Ctrl + C w terminalu).
  • continue – pomija dalszą część aktualnej iteracji i przechodzi do kolejnej
i = 0
while i < 10:
    i += 1
    if i == 5:
        continue  # pomija wypisanie 5
    if i == 8:
        break     # przerywa pętlę przy 8
    print(i       #wynik: 0, 1, 2, 3, 4, 6, 7
  • while True: to popularny sposób tworzenia głównej pętli w programach interaktywnych (np. gry, menu konsolowe).

📌 Kiedy używać while, a kiedy for?

  • while – gdy nie wiadomo z góry ile razy coś ma się wykonać (np. czekamy na spełnienie warunku).
  • for – gdy wiadomo ile razy coś ma się wykonać (np. iteracja po elementach listy).

Ciąg fibonacciego

Wzór ciągu Fibonacciego, definiuje się następująco: każdy element ciągu, począwszy od trzeciego, jest sumą dwóch poprzednich. Pierwsze dwa elementy ciągu to zazwyczaj 0 i 1, lub 1 i 1. Zatem, wzór rekurencyjny wygląda następująco: F(n) = F(n-1) + F(n-2), gdzie F(0) = 0, a F(1) = 1 (lub F(0) = 1, F(1) = 1). 

🧠 Gdzie spotyka się ciąg Fibonacciego?

  • 📐 Złoty podział (np. spirala Fibonacciego)
  • 🌻 Wzory w przyrodzie – liście, ananasy, kwiaty
  • 🎨 Sztuka i architektura (złota proporcja)
  • 📊 Algorytmy: dynamiczne programowanie, struktury danych (drzewa Fibo)
  • 🎲 Przykład w uczeniu się rekurencji, iteracji i optymalizacji
import turtle

fibo = [0, 1]
suma_ostatnich = fibo[0] + fibo[1]

# czy zgodzicie sie, ze to powyzej mozna tez zapisac
# jako suma_ostatnich = fibo[-1]+fibo[-2]import turtle

zolwik = turtle.Turtle()
zolwik.speed(4)
zolwik.shape("turtle")
zolwik.pensize(2)
dlugosc_boku = 16
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34....]

fibo = [0, 1]

suma_ostatnich = fibo[-1]+fibo[-2]

# zakladamy, ze liczymy do wartosci mniejszej od 98
gorna_granica =  567

while suma_ostatnich < gorna_granica:
    fibo.append(suma_ostatnich)
    suma_ostatnich = fibo[-1]+fibo[-2]

print(fibo)

for i in fibo[1:]:
    for _ in range(6):      # 6 powtórzeń, ponieważ do wyrysowanego kwadratu dodajemy trasę na przeciwlegly kąt kwadratu i ustawienie żółwia w odpowiednim kierunku
        zolwik.forward(dlugosc_boku * i)  
        zolwik.left(90)
    zolwik.right(90)

zolwik.exitonclick()

Random walk

- przykład na wykorzystanie pętli while (nie musi on zawsze wykorzystywać tej pętli)

🎯 Do czego wykorzystuje się random walk?

🧪 1. Fizyka i chemia - ruchy cząsteczek w cieczy lub gazie (np. ruchy Browna), modelowanie dyfuzji – jak substancje się rozprzestrzeniają

📈 2. Finanse - modelowanie cen akcji lub walut – zakłada się, że zmieniają się losowo, używany w teorii efektywnego rynku (EMH)

🧠 3. Sztuczna inteligencja i uczenie maszynowe - przeszukiwanie przestrzeni stanów w algorytmach (np. Monte Carlo Tree Search), wstęp do metod eksploracji np. w Reinforcement Learning

📊 4. Symulacje komputerowe - Monte Carlo simulations – do przewidywania wyników procesów losowych, testowanie robustności systemów, np. sieci komputerowych lub biologicznych

🌍 5. Biologia i ekologia - modelowanie migracji zwierząt, opisanie rozmnażania się lub rozprzestrzeniania genów

🧩 6. Grafika komputerowa - Tworzenie tekstur proceduralnych, Symulacja chaosu, dymu, płynów, wzorów naturalnych

🧮 7. Teoria grafów i algorytmy - random walk po grafie – np. używany w algorytmie PageRank Google’a, znajdowanie powiązań między węzłami (np. w sieciach społecznościowych).

import turtle
import random

screen = turtle.Screen()
screen.setup(400, 800)

zolwik = turtle.Turtle()
zolwik.speed(8)
zolwik.shape("turtle")
zolwik.pensize(5)

kolory = [
    "CornflowerBlue",
    "DarkOrchid",
    "IndianRed",
    "DeepSkyBlue",
    "LightSeaGreen",
    "wheat",
    "SlateGray",
    "SeaGreen",
katy = [0, 90, 180, 270]
odleglosc = 10


#rozwiązanie 1
while True:
    zolwik.left(random.choice(katy))
    zolwik.forward(odleglosc)

#rozwiązanie 2
# kroki = 0
# maks_krokow = 1000

while kroki <= maks_krokow:
    zolwik.setheading(random.choice(katy))  # lepsze niż left() przy 0/90/180/270
    zolwik.pencolor(random.choice(kolory))
    zolwik.forward(odleglosc)
    kroki += 1


turtle.exitonclick()

Program - zgadnij liczbę

# Zasady: 
#    wersja podstawowa - 10 podejsć
#    gra polegająca na odgadnięciu liczby z przedziału 1-100  -> random.rrandint()
#    ograniczenie - stosujemy pętle while
#    wersja zaawansowana - wybór poziomu trudnosci -(trudniejszym = 3 podejścia)

import random


losowanie = random.randint(1,100)
print(losowanie)    # pokazujemy wylosowana liczbę, dla sprawdzenia czy program odpowiednio reaguje

# Wybór poziomu trudności
poziom = int(input("Wybierz poziom: wpisz 1 aby wybrać łatwy wariant  / wpisz 2 jeśli chcesz zagrać na trudnym poziomie: ").lower())

if poziom == 1:
    podejscia = 10
else:
    podejscia = 3

# Kod gry
while podejscia > 0:
    wybor_gracza = int(input("Podaj liczbę od 1 do 100: "))
    podejscia -=  1

    if losowanie == wybor_gracza:  
        print("Wygrana! Gratulacje")
        break
    elif wybor_gracza < losowanie:
        print("Za mało!")
    else:
        print("Za dużo!")
    
    if podejscia == 0:
        print(f"Przegrana, wylosowaną liczbą było {losowanie}")
        break
    else:
        print(f"Zostało Ci {podejscia} prób.") 

Rozwiązanie zadania

- wyszukaj logi z czerwca i z komunikatem ERROR:

#rozwiązanie zadania  
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 log in logi:
    if "2025-06" in log[0] and "ERROR" in log[0]:
        print(log)

Kwestionariusz wykonany z wykorzystaniem pętli while

FUNKCJA ENUMERATE:

  • W Pythonie, kiedy używasz funkcji enumerate(), możesz dodać argument start=1, który określa, od jakiej liczby zaczyna się numeracja.
  • Przykład:
owoce = ["jabłko", "gruszka", "banan"]

for i, owoc in enumerate(owoce):
    print(f"{i}. {owoc}")

Wynik:

Kwestionariusz:

import random

kwestionariusz = {
    "Co niezwykłego jest w odchodach wombatów?": [
        ("Są zielone jak trawa", -0.5),
        ("Mają kształt kostki", +1),
        ("Świecą w ciemności", -0.5)
    ],          

    "Jak porusza się kangur, kiedy idzie powoli (nie skacze)?":[
        ("Chodzi wyłącznie na tylnych łapach",-0.5),
        ("Chodzi na czterech łapach jak pies", -0.5),
        ("Opiera się na ogonie jak na trzeciej nodze", +1)
    ],
    
    "Ile może żyć rekin arktyczny (grenlandzki)?": [
        ("Ponad 400 lat", +1),
        ("Około 150 lat",-0.5),
        ("Do 70 lat",-0.5)
                ],
    
    "Dlaczego kapibary są często pokazywane w towarzystwie innych zwierząt?": [
        ("Są niezwykle spokojne i towarzyskie", +1),
        ("Mają zapach, który przyciąga ptaki",-0.5),
        ("Mimo, że są bardzo hałaśliwe, ale lubią dzielić się jedzeniem z innymi gatunkami", -0.5)
                ],
    
    "Dlaczego kuoka nazywana jest „najsłodszym zwierzęciem świata' ": [
        ("Bo wygląda jakby ciągle się uśmiechała",+1),
        ("Bo ma miękkie futro i fioletowy język",-0.5),
        ("Bo daje się głaskać każdemu człowiekowi",-0.5)
                ],

    "Co pomaga panterze śnieżnej przetrwać w zimnym klimacie?": [
        ("Ma specjalne gruczoły ogrzewające krew",-0.5),
        ("Ma bardzo gęste, grube futro i szerokie łapy",+1),
        ("Zapada w sen zimowy na 3 miesiące",-0.5)
                ],
    
    "Dlaczego alpaki często plują?": [
        ("Aby wyrazić niezadowolenie lub pokazać dominację", +1),
        ("Bo mają za dużo śliny", -0.5),
        ("Bo to sposób, w jaki się porozumiewają z ludźmi", -0.5)
                ],  
   
    "Co wyróżnia żółwia słoniowego z Galapagos?": [
        ("Potrafi pływać z prędkością 20 km/h", -0.5),
        ("Ma miękki pancerz, który zmienia kolor", -0.5),
        ("Jest jednym z największych żółwi lądowych na świecie", +1)
                ], 

    "Jak słonie indyjskie okazują emocje?": [
        ("Przez dotyk, dźwięki i ruchy trąby", +1),
        ("Przez zmianę koloru skóry", -0.5),
        ("Poprzez machanie uszami w różne strony", -0.5)
                ],
    
    "Ile serc ma ośmiornica?" : [
        ("jedno", -0.5),
        ("osiem", -0.5),
        ("trzy", +1)
                ]
}


### Baza

# Zamieniamy słownik na listę par (pytanie, odpowiedzi), by móc przetasować
pytania_lista = list(kwestionariusz.items())
random.shuffle(pytania_lista)

# Przechodzimy po pytaniach
for numer, (pytanie, odpowiedzi) in enumerate(pytania_lista, start=1):
    print(f"\nPytanie {numer}: {pytanie}")

    # Tworzymy kopię odpowiedzi i tasujemy ją
    odp_tasowane = list(odpowiedzi)  # kopia
    random.shuffle(odp_tasowane)

    # Wyświetlamy odpowiedzi
    for i, (tekst, punkty) in enumerate(odp_tasowane, start=1):
        print(f"  {i}. {tekst}")

Wynik (przetasowane pytania i odpowiedzi):