Python #5 (biblioteki, pętla for, turtle)
Duży plus Pythona to duży zbiór bibliotek: https://pypi.org/
- Biblioteka to zbiór gotowych funkcji, klas i narzędzi napisanych w danym języku programowania, które można wykorzystać w swoim programie.
- Dzięki bibliotekom nie musimy pisać wszystkiego od zera – możemy korzystać z kodu przygotowanego i przetestowanego wcześniej przez innych programistów.
- Biblioteka rozszerza możliwości języka – dodaje obsługę nowych formatów, algorytmów, narzędzi, interfejsów, itp.
Instalacja i dodanie biblioteki
import nazwa_biblioteki, np. import turtle
jeśli danej biblioteki nie ma na komputerze (ale wiemy, że jest np. na PyPi) to otwieramy terminal: pip3 install nazwa_modułu
Biblioteka może być instalowana w terminalu systemowym (np. PowerShell. Alternatywnie w terminalu VS Code.
Poetry to popularny menedżer zależności i narzędzie do pakietowania dla Pythona. Ułatwia instalację bibliotek, zarządzanie wersjami, tworzenie środowisk wirtualnych i publikację pakietów na PyPI.
Najważniejsze cechy:
- Deklarowanie zależności w pliku pyproject.toml (zamiast requirements.txt).
- Automatyczne tworzenie środowisk wirtualnych.
- Blokada wersji w pliku poetry.lock dla powtarzalnych instalacji.
- Wbudowane narzędzia do publikacji pakietów.
uv to nowoczesny menedżer zależności i środowisk dla Pythona, rozwijany przez firmę Astral. Powstał jako szybsza i prostsza alternatywa dla pip, pip-tools, venv i w pewnym sensie nawet dla Poetry. https://astral.sh/
Najważniejsze cechy:
- Błyskawiczna instalacja zależności (napisana w Rust, dużo szybsza niż pip).
- Obsługa plików requirements.txt i pyproject.toml.
- Automatyczne tworzenie i zarządzanie środowiskami wirtualnymi.
- Integracja z pip i venv, dzięki czemu nie trzeba rezygnować ze starych projektów.
Dobra praktyka – krótkie skrypty piszemy sami, bez korzystania z bibliotek zewnętrznych. Z bibliotek korzystamy, ale z umiarem. Jeśli problem jest trywialny i nie wymaga wielu linijek kodu – rozwiązujemy go samodzielnie. patrz npm left-pad incident https://en.wikipedia.org/wiki/Npm_left-pad_incident
Zasada DRY (Don’t Repeat Yourself) mówi, że każdy fragment wiedzy w systemie powinien mieć jedno, spójne źródło. W praktyce oznacza to unikanie duplikowania kodu, logiki czy danych. Jest to jedna z najważniejszych praktyk dobrego kodowania i projektowania systemów.
Pętla for
Pętla for to sposób na powtarzanie tego samego kodu wielokrotnie. Zamiast pisać ten sam kod 10 razy, używasz pętli i Python zrobi to za Ciebie.
element - nazwa zmiennej, którą sobie wymyślamy (ona nie była wcześniej deklarowana)
kolekcja - to może być np. lista, słownik.
# Składnia
for element in kolekcja:
# kod do wykonania
print(element)
zwierzaki = ["pies", "kot", "chomik", "rybki"]
for zwierzak in zwierzaki:
print(zwierzak)
# python sprawdza czy nasza sekwencja ma jeszcze jakies elementy
# tak, sa elementy
# bierzemy pierwszy "pies" i przypisujemy do zmiennej o nazwie zwierzak
# drukujemy zmienną zwierzak (pies)
# python sprawdza czy nasza sekwencja ma jeszcze jakies elementy
# tak, sa elementy
# bierzemy drugi "kot" i przypisujemy do zmiennej o nazwie zwierzak
# drukujemy zmienną zwierzak (kot)
# python sprawdza czy nasza sekwencja ma jeszcze jakies elementy
# tak, sa elementy
# bierzemy trzeci "chomik" i przypisujemy do zmiennej o nazwie zwierzak
# drukujemy zmienną zwierzak (chomik)
# python sprawdza czy nasza sekwencja ma jeszcze jakies elementy
# tak, sa elementy
# bierzemy czwarty "rybki" i przypisujemy do zmiennej o nazwie zwierzak
# drukujemy zmienną zwierzak (rybki)
# python sprawdza czy nasza sekwencja ma jeszcze jakies elementy
# nie - wychodzimy z pętli
# Wynik:
# pies
# kot
# chomik
# rybki
for litera in "Robisz.to":
print(litera)
# range
for costam in range(1,11):
print(costam*"*")
# Wynik:
*
**
***
****
*****
******
*******
********
*********
**********
# odliczanie do 100
for _ in range(1,101):
print(_)
# odliczanie w dół
for _ in range(10,0,-1):
print(_)
# wyświetl klucze słownika (domyślnie wyświetla klucze)
przepisy = {"jajecznica" : "jajka, sól, masło",
"pizza" : "mąka, drożdże, przyprawy, ser"}
for klucz in przepisy:
print(klucz)
# wyciągamy wartości
for klucz in przepisy:
print(przepisy[klucz])
# wyciągamy wartości z metodą .values()
for wartosc in przepisy.values():
print(wartosc)
# .items zamienia słownik na listę krotek, w kazdej pierwsza wartość to klucz
print(przepisy.items())
for klucz, wartosc in przepisy.items():
print(klucz)
print(wartosc)
print("*****")
# wyświetlanie w jednej linijce
for i in range(5):
print(i, end=", ")
Dobra praktyka: jeśli ze zmiennej, np. w pętli for, już nie będziemy korzystać nazwijmy ją "_".
# gdy mamy zagnieżdżone struktury danych, np. krotki w liscie:
lista = [(1,"pies"), (2,"kot"), (3, "chomik")]
for element in lista:
print(f"ID: {element[0]}")
print(f"Zwierzak: {element[1]}")
print("*******")
#inny sposób
przepisy = {"jajecznica" : ["jajka", "sól", "masło"],
"pizza" : ["mąka","drożdże"]}
for potrawa in przepisy:
print("Nazwa: " , potrawa)
for skladnik in przepisy[potrawa]:
print("Lista składników: " , skladnik)
print("*********")
bond_films = [
("Doktor No (Dr. No)", 1962),
("Pozdrowienia z Rosji (From Russia with Love)", 1963),
("Goldfinger", 1964),
("Operacja Piorun (Thunderball)", 1965),
("Żyje się tylko dwa razy (You Only Live Twice)", 1967),
("W tajnej służbie Jej Królewskiej Mości (On Her Majesty's Secret Service)", 1969),
("Diamenty są wieczne (Diamonds Are Forever)", 1971),
("Żyj i pozwól umrzeć (Live and Let Die)", 1973),
("Człowiek ze złotym pistoletem (The Man with the Golden Gun)", 1974),
("Szpieg, który mnie kochał (The Spy Who Loved Me)", 1977),
("Moonraker", 1979),
("Tylko dla twoich oczu (For Your Eyes Only)", 1981),
("Ośmiorniczka (Octopussy)", 1983),
("Zabójczy widok (A View to a Kill)", 1985),
("W obliczu śmierci (The Living Daylights)", 1987),
("Licencja na zabijanie (Licence to Kill)", 1989),
("GoldenEye", 1995),
("Jutro nie umiera nigdy (Tomorrow Never Dies)", 1997),
("Świat to za mało (The World Is Not Enough)", 1999),
("Śmierć nadejdzie jutro (Die Another Day)", 2002),
("Casino Royale", 2006),
("Quantum of Solace", 2008),
("Skyfall", 2012),
("Spectre", 2015),
("Nie czas umierać (No Time to Die)", 2021)
]
for film in bond_films:
tytul = film[0] #rozpakowanie krotki
rok = film[1]
if "Doktor No" in tytul:
print(f"Film {tytul} pojawił się w kinach w roku {rok}")Moduł Turtle
Służy do rysowania z pomocą kodu. Idealnie nadaje się do ćwiczeń pętli - od razu widać co się dzieje, tym samym łatwiej diagnozować błędy.
Importuje się go poprzez: import turtle
Przygotowanie programu dla “żółwia”
Po zaimportowaniu biblioteki należy stworzyć “żółwia” i przestrzeń po której będzie się poruszał:
zolwik = turtle.Turtle
Z kolei pod koniec naszego kodu (po tym jak już skończymy rysować) powinniśmy dodać:
turtle.exitonclick()
To spowoduje, że okno z programem nie zamknie się natychmiast po tym jak żółwik skończy pracę.
# Nie nazywać pliku .py jako turtle;)
import turtle
zolwik = turtle.Turtle() # stworz obiekt rysujacego zolwia pod zmienna zolwik
zolwik.speed(4) # ustaw szybkosc zolwia wbudowana metoda speed
zolwik.shape("turtle") # uzyj metody shape do ustawienia wygladu kursora / zolwia
# kwadrat
for _ in range (4):
zolwik.forward(100)
zolwik.right(90)
# sześciokąt
liczba_scian = 6
kat = 360/liczba_scian
for _ in range(6):
zolwik.forward(100)
zolwik.right(kat)
# rozeta
kat = 360 / 20
for _ in range(20):
zolwik.circle(100)
zolwik.right(kat))
# okrąg + kwadrat
zolwik.circle(100)
zolwik.penup()
zolwik.forward(150)
zolwik.pendown()
for _ in range(4):
zolwik.forward(200)
zolwik.left(90)
# rozeta z kwadratów
kat = 360 / 30
for _ in range(30):
for i in range(4):
zolwik.forward(100)
zolwik.right(90)
zolwik.right(kat)
turtle.exitonclick() # na koniec rysowania nie zamykaj okna - poczekaj na kliknięcieZadania
Zad. 1. Spróbujcie z pomocą modułu Turtle odtworzyć te obrazki:
a)

# gdy wysokość się podwaja
dlugosc = 40
for i in range(4):
for _ in range(2):
zolwik.forward(10)
zolwik.left(90)
zolwik.forward(dlugosc)
zolwik.left(90)
zolwik.forward(10)
dlugosc *= 2
# aby obrazek był podobny
dlugosc = 40
for i in range(4):
for _ in range(2):
zolwik.forward(10)
zolwik.left(90)
zolwik.forward(dlugosc)
zolwik.left(90)
zolwik.forward(10)
dlugosc += 20b)

dlugosc = 30
for _ in range (8):
for i in range(4):
zolwik.forward(dlugosc)
zolwik.left(90)
dlugosc += 10c)

for _ in range(4):
for _ in range(3):
zolwik.forward(100)
zolwik.left(90)
zolwik.right(180)Zad.2. Wcielcie się w rolę osoby zajmującej się administracją IT. Dostałyście zgłoszenie, że w czerwcu był jakiś problem z aplikacją działającą na serwerze. Zgrałyście z niego logi. Macie je teraz dostępne w postaci listy w Pythonie (później nauczymy się wczytywać dane z plików) w następującej postaci. Korzystając z pętli for wyciągnijcie wpisy z czerwca zawierające komunikat “ERROR” (oba warunki
muszą być spełnione!).
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]
if "2025-06" in tekst and "[ERROR]" in tekst:
print(tekst)
# Wynik: [2025-06-25T05:48:22] [ERROR] Booom... i wybuchło...
inny przykład:
logi = [
["[2025-03-12T09:10:00] [INFO] System uruchomiony."],
["[2025-03-12T10:15:30] [WARN] Wysokie zużycie pamięci."],
["[2025-03-12T11:48:50] [ERROR] Brak połączenia z bazą danych."],
["[2025-04-01T08:22:10] [INFO] Połączenie z bazą przywrócone."],
["[2025-04-02T14:30:00] [ERROR] Niewystarczające uprawnienia."],
["[2025-04-03T19:45:00] [WARN] Serwer zbliża się do limitu obciążenia."],
["[2025-04-04T20:00:00] [ERROR] Plik konfiguracyjny uszkodzony."],
["[2025-05-01T07:00:00] [INFO] Backup zakończony sukcesem."],
]
for wpisy in logi:
tekst = wpisy[0]
if "2025-04-" in tekst and "ERROR" in tekst or "2025-04-" in tekst and "WARN" in tekst:
print(wpisy)Zad. 3. quiz (aktualny status)
print("*************************")
print("""Witaj w quizie Python""")
print("*************************")
print("Zaczynamy!")
dane_gracza = input("Podaj swoje imię: ")
print("")
punkty = 0
baza_pytan = [
{
"pytanie" : "Gdzie w komórce eukariotycznej znajduje się DNA?",
"odpowiedzi" : [
("w jądrze komórkowym", 1),
("w wakuoli", -1),
("w cytoplazmie", -1)
]
} ,
{
"pytanie" : "Jaką strukturę przestrzenną ma cząsteczka DNA?",
"odpowiedzi" : [
("Podwójna helisa", 1),
("Potrójna spirala", -1),
("Potrójna helisa", -1)
]
} ,
{
"pytanie" : "Która zasada azotowa łączy się zawsze z tyminą?",
"odpowiedzi" : [
("Guanina", -1),
("Adenina", 1),
("Cytozyna", -1)
]
} ,
{
"pytanie" : "Z jakich zasad azotowych zbudowany jest DNA?",
"odpowiedzi" : [
("Adenina, Tymina, Cytozyna, Guanina", 1),
("Adenina, Uracyl, Cytozyna, Guanina", -1),
("Adenina, Tyrozyna, Cysteina, Glutamina", -1)
]
} ,
{
"pytanie" : "Jaką rolę pełni DNA w organizmach żywych?",
"odpowiedzi" : [
("Odpowiada za transport tlenu", -1),
("Dostarcza energii do reakcji komórkowych", -1),
("Jest nośnikiem informacji genetycznej", 1)
]
}
]
# Losowe przemieszanie pytań
import random
pytania_pomieszane = baza_pytan.copy()
random.shuffle(pytania_pomieszane)
# Pętla po pytaniach quizu
for pytanie in pytania_pomieszane:
print("\n" + pytanie["pytanie"])
for i, (odp, punkty_odp) in enumerate(pytanie["odpowiedzi"], start=1):
print(f"{i}. {odp}")
wybor = int(input("Wybierz odpowiedź (numer 1, 2 lub 3): "))
punkty += pytanie["odpowiedzi"][wybor-1][1]
# wybor -1, bo odnosimy się do indeksow, ktore polecą od 0 i [1] jako indeks punktacji w krotce
# Podsumowanie quizu
print("\n***************************************")
print(f"Twoja liczba punktów to {punkty}/5")
if punkty >= 3:
print("Test zaliczony. Gratulacje!")
else:
print("Spróbuj jeszcze raz")
print("\n***************************************")Zad. 4. Spróbujcie napisać aplikację liczącą ciąg Fibonacciego startując
od 0 i dając użytkownikowi możliwość wpisania maksymalnej wartości dla pozycji ciągu.
n = int(input("Wprowadź liczbę naturalną większą niż 10: "))
ciag_fib = [0 , 1]
for i in range(2, n):
ciag_fib.append(ciag_fib[-1] + ciag_fib[-2])
print(ciag_fib)