dla Twórców Gier
Naucz się Pythona od zera — przez pisanie, nie czytanie. Każda sekcja to przykład, zadania z oczekiwanym wynikiem i projekt końcowy. 7 modułów, które dają solidne podstawy przed kursem Pygame.
Szczegółowa instrukcja krok po kroku z obrazkami (Windows / Mac / Linux):
📦 Otwórz pełną instrukcję instalacji →python --version i widzisz np. Python 3.12.4.py to zwykły plik tekstowy z instrukcjami. Terminal to miejsce gdzie widzisz wynik. Każda linia kodu = jedna instrukcja dla Pythona.cwiczenie_m01_1.pypython cwiczenie_m01_1.pyzycia = 3 # ile żyć ma gracz
punkty = 0 # wynik w HUD
statek_x = 400 # pozycja x statku (środek ekranu 800px)
predkosc = 5 # pikseli na klatkę
SZEROKOSC = 800 # stała — szerokość okna gry
print() to najważniejsza funkcja na początku nauki. Możesz wypisać tekst (w cudzysłowie), liczbę, a nawet kilka rzeczy naraz oddzielając je przecinkami. Pusta linia print() bez argumentów daje wolny wiersz.print("Witaj, Python!")
print(42)
print("Imie:", "Anna")
print() # pusta linia
print("Koniec")
print(Witaj) bez cudzysłowu — Python myśli że Witaj to nazwa zmiennej. Tekst ZAWSZE w cudzysłowie: "tekst" lub 'tekst'.print(). Dodaj pustą linię między każdą informacją. Oczekiwany wynik: trzy linie z informacjami, oddzielone pustymi liniami.print() dla każdej linii. Oczekiwany wynik: 3 x 1 = 3, 3 x 2 = 6 ... 3 x 5 = 15. Liczby wpisz ręcznie — nie używaj zmiennych.print() z tekstem i liczbąprint() przez przecinekprint() bez argumentów#. Python całkowicie je ignoruje. Dobry komentarz mówi DLACZEGO, nie CO — bo co kod robi widać z samego kodu.# To jest komentarz — Python go ignoruje
print("Ten kod sie wykona")
# print("Ten sie NIE wykona")
# Wyjasniaj DLACZEGO, nie CO:
# ZLE: # dodajemy 1 do x
# DOBRE: # punkty rosna o 1 co klatke gry
print() wyjaśniający dlaczego wypisujesz akurat tę informację. Upewnij się że program działa tak samo jak wcześniej.print(). Zakomentuj dwie z nich (dodaj # na początku). Uruchom i sprawdź że wypisują się tylko 3. Oczekiwany wynik: tylko te 3 linie które nie mają #.#= to przypisanie (nie równość!). Nazwy piszemy małymi literami, słowa łączymy podkreśleniem — to konwencja snake_case.imie = "Anna" # str — tekst
wiek = 25 # int — liczba calkowita
wzrost = 1.68 # float — liczba z przecinkiem
student = True # bool — prawda lub falsz
print(imie)
print(wiek)
print(wzrost)
print(student)
1imie = "Anna" lub moje imie = "Anna" — nazwa zaczyna się cyfrą albo ma spację.moje_imie = "Anna" — małe litery, słowa połączone podkreśleniem (snake_case).imie (str), wiek (int), miasto (str), lubi_python (bool). Wypisz każdą osobno. Oczekiwany wynik: cztery linie z Twoimi danymi.wynik = 10. Wypisz ją. Potem zmień jej wartość na 99 i wypisz ponownie. Oczekiwany wynik: 10, potem 99. Udowodnij sobie że zmienne można nadpisywać.type() sprawdza typ dowolnej wartości. Ważna pułapka: cyfra w cudzysłowie to tekst, nie liczba! "5" to str, 5 to int — zupełnie inne rzeczy.imie = "Anna"
wiek = 25
wzrost = 1.68
student = True
print(type(imie)) # <class 'str'>
print(type(wiek)) # <class 'int'>
print(type(wzrost)) # <class 'float'>
print(type(student)) # <class 'bool'>
a = 5 # int — liczba
b = "5" # str — tekst z cyfra
print(a + 10) # 15 — OK
# print(b + 10) # TypeError!
wiek = "25" to TEKST, nie liczba — wiek + 5 da błąd. Zawsze sprawdzaj czy Twoja liczba ma cudzysłów!type(). Oczekiwany wynik: 8 linii z <class '...'>.a = 5 (int) i b = "5" (str). Wypisz type(a) i type(b). Spróbuj dodać a + 10 (powinno działać) i b + 10 (powinno rzucić błąd). Zapisz komunikat błędu w komentarzu.type() do sprawdzania typów"5" (str) od 5 (int)/ zawsze daje float (np. 10/2 = 5.0), a // to dzielenie całkowite bez reszty (np. 10//3 = 3).a = 10
b = 3
print(a + b) # 13 — dodawanie
print(a - b) # 7 — odejmowanie
print(a * b) # 30 — mnozenie
print(a / b) # 3.333... — dzielenie (zawsze float!)
print(a // b) # 3 — dzielenie calkowite
print(a % b) # 1 — reszta z dzielenia
print(a ** b) # 1000 — potegowanie
/ zawsze daje float. Gdy chcesz liczbę całkowitą bez reszty, użyj //: 10 // 3 == 3.7*24*60), czy 17 jest parzyste (17 % 2 == 0), wartość 2**10. Oczekiwany wynik: 10080, False, 1024.7 // 2 = 3, 7 % 2 = 1 itd./ daje float, a // liczbę całkowitąwynik1 = 2 + 3 * 4 # 14, nie 20!
wynik2 = (2 + 3) * 4 # 20 — nawiasy wygrazaja kolejnosc
print(wynik1) # 14
print(wynik2) # 20
pensja = 3000
premia_proc = 10
premia = pensja * premia_proc / 100
print(f"Premia: {premia} zl") # 300.0
2+3*4, (2+3)*4, 10-2**3, (10-2)**3. Oczekiwane wyniki: 14, 20, 2, 512.Objetosc: 30.f"..." i umieszczasz zmienne lub wyrażenia w nawiasach klamrowych {}. W klamrach możesz nawet obliczać wyrażenia matematyczne. Formatowanie: {wartosc:.2f} — dwa miejsca po przecinku.imie = "Anna"
wiek = 25
print(f"Czesc, mam na imie {imie}!")
print(f"Mam {wiek} lat.")
print(f"Za 10 lat bede miec {wiek + 10} lat.")
pi = 3.14159265
print(f"Pi = {pi:.2f}") # 2 miejsca po przecinku
"Mam " + wiek + " lat" — Python nie łączy automatycznie tekstu z liczbą.f"Mam {wiek} lat".Czesc, jestem [imie], mam [wiek] lat i mieszkam w [miasto]. W klamrach oblicz też rok urodzenia (2025 - wiek).:.2f. Oczekiwany wynik: Netto: 49.99 zl, VAT: 11.50 zl, Brutto: 61.49 zl.f"..."{}:.2fint(), float() i str() zmieniają typ wartości. Ważne: nie każdy string da się zamienić — int("trzy") rzuci błąd. Konwersja float → int ucina część dziesiętną (nie zaokrągla).tekst = "42"
liczba = int(tekst) # str → int
ulamek = float("3.14") # str → float
wiek = 25
opis = "Mam " + str(wiek) + " lat" # int → str
print(type(tekst)) # <class 'str'>
print(type(liczba)) # <class 'int'>
print(opis) # Mam 25 lat
print(int(3.9)) # 3 — ucina, nie zaokragla!
int("trzy") lub int("3.14") — string musi zawierać same cyfry.float("3.14"), potem ewentualnie int().liczba_tekst = "15". Zamień na int, dodaj 10 i wypisz wynik. Następnie zamień wynik z powrotem na str i połącz z tekstem "Wynik: ". Oczekiwany wynik: 25, potem Wynik: 25.int(7.9), int(7.1), int(-3.5). Wypisz wszystkie trzy. Oczekiwany wynik: 7, 7, -3. Jaki wniosek z tego wyciągasz?int(), float(), str()int() ucina część dziesiętnąinput() zatrzymuje program, wyświetla pytanie i czeka. Zawsze zwraca str — nawet jeśli wpiszesz liczbę! Gdy potrzebujesz liczby, od razu konwertuj: int(input(...)) lub float(input(...)).imie = input("Jak masz na imie? ")
print(f"Czesc, {imie}!")
wiek = int(input("Ile masz lat? "))
rok_ur = 2025 - wiek
print(f"Urodziles/as sie w {rok_ur} roku.")
print(f"Za 10 lat bedziesz miec {wiek + 10} lat.")
wiek = input("Wiek: ") zwraca str, więc wiek + 5 da błąd.wiek = int(input("Wiek: ")) gdy chcesz liczbę.Czesc [imie], masz [wiek] lat. Za 5 lat bedziesz miec [wiek+5] lat. Wejście: Anna, 20. Oczekiwany wynik: Czesc Anna, masz 20 lat. Za 5 lat bedziesz miec 25 lat.:.2f. Wejście: 7.5 i 2. Oczekiwany wynik: suma 9.50, różnica 5.50, iloczyn 15.00, iloraz 3.75.input() do pobierania danych od użytkownikainput() zawsze zwraca strrandom.randint() żeby asteroida pojawiała się w losowym miejscu!import tools i masz cały warsztat. Moduł random to zestaw do losowania — dokładnie tego czego potrzebujemy w grze!nazwa_modułu.funkcja().import random # moduł do losowania
import math # moduł matematyczny
# Używamy przez: nazwa_modulu.funkcja()
print(random.randint(1, 10)) # losowa liczba 1–10
print(math.sqrt(16)) # pierwiastek = 4.0
print(math.pi) # 3.14159...
random.randint(a, b) — losuje całkowitą od a do b (obie granice włączone)random.choice(lista) — losuje jeden element z listyrandom.uniform(a, b) — losuje zmiennoprzecinkową między a i bimport random
# W grze Asteroidy te 3 linie to podstawa!
pozycja_x = random.randint(0, 800) # gdzie pojawi się asteroida
rozmiar = random.randint(20, 55) # jak duża
predkosc = random.uniform(2.0, 4.5) # jak szybko spada
print(f"Asteroida: x={pozycja_x}, r={rozmiar}, v={predkosc:.1f}")
import random na górze pliku! Python nie wie co to random dopóki go nie zaimportujesz.import random musi być przed pierwszym użyciem random.randint().["czerwony", "zielony", "niebieski", "żółty"] i wypisuje "Kolor lasera: [wylosowany]". Użyj random.choice().import nazwarandom.randint(a, b) do losowania liczby całkowitejrandom.choice(lista) do losowania elementuprint()#type()int(), float(), str()input()import random i używać random.randint()Napisz program który pyta użytkownika o jego dane i wypisuje elegancką kartę w ramce ASCII.
2025 - wiek) i wiek za 10 lat."=" * 35 i tytułem wyśrodkowanym..upper()):<16if (jeśli) i else (w przeciwnym razie). Dzięki temu program może być przydatny dla różnych użytkowników z różnymi danymi.cwiczenie_m02_1.pypython cwiczenie_m02_1.pyif zycia <= 0:
stan_gry = "game_over" # koniec gry!
if laser_trafil_wroga:
punkty += 20 # wróg trudniejszy = więcej pkt
elif laser_trafil_asteroide:
punkty += 10 # asteroida łatwiejsza = mniej pkt
if trafiony and not nietykalny:
zycia -= 1 # traci życie tylko gdy nie jest nietykalny
bool ma tylko dwie możliwe wartości: True (prawda) i False (fałsz). Każde porównanie liczb lub wartości zwraca bool. To jest podstawa wszystkich warunków.prawda = True
falsz = False
print(prawda) # True
print(falsz) # False
print(type(prawda)) # <class 'bool'>
# Wynik porownania to zawsze bool
print(5 > 3) # True
print(5 < 3) # False
print(5 == 5) # True
print(5 != 5) # False
10 > 5, 3 == 4, 7 != 7, 100 >= 100, 0 < -1, "ala" == "ala". Wpisz przewidywania w komentarzach, potem sprawdź w Pythonie.a = 15, b = 20. Wypisz wyniki 6 porównań między nimi (używając wszystkich 6 operatorów). Oczekiwany wynik: np. a > b = False, a < b = True itd.>, <, >=, <=, ==, !=. Możesz je łączyć w łańcuch: 0 < hp <= 100 — elegancka forma sprawdzająca dwa warunki naraz.hp = 75
print(hp > 50) # True — powyzej polowy
print(hp < 0) # False — czy martwy
print(hp >= 100) # False — pelne HP
print(hp <= 30) # False — krytyczny
print(hp == 75) # True — dokladnie 75
print(hp != 100) # True — nie maksymalne
print(0 < hp <= 100) # True — zakres prawidlowy
temperatura = 22. Sprawdź i wypisz (True/False): mróz (< 0), gorąco (> 30), komfortowo (18 <= temperatura <= 24). Oczekiwany wynik: False, False, True.haslo = "python123". Sprawdź czy ma więcej niż 8 znaków (len(haslo) > 8) i czy jest równe "python123". Wypisz oba wyniki.a <= x < b= to polecenie "daj mi to" — ustawiasz wartość. == to pytanie "czy to jest tamto?" — sprawdzasz wartość. Zupełnie różne znaczenia, podobny wygląd — klasyczna pułapka.= to przypisanie — ustawia wartość zmiennej. == to porównanie — zwraca True lub False. W warunkach if zawsze potrzebujesz ==. Python zgłosi SyntaxError gdy użyjesz = w if — to chroni przed błędem.x = 5 # PRZYPISANIE: x wynosi 5
print(x == 5) # POROWNANIE: True
print(x == 10) # POROWNANIE: False
# if x = 5: <-- SyntaxError! (dobra wiadomosc)
if x == 5: # poprawnie
print("x wynosi 5")
if imie = "Anna": — Python natychmiast zgłasza błąd. W warunkach zawsze ==.if imie = "Anna":, if wynik = 100:, if zyje = True:. Napisz poprawne wersje i sprawdź że działają.haslo = "abc". Używając if/else sprawdź czy jest równe "python123". Wypisz odpowiednio "Dostep przyznany" lub "Bledne haslo". Oczekiwany wynik dla "abc": Bledne haslo.= (przypisanie) z == (porównanie)==if warunek: piszemy blok kodu z wcięciem (4 spacje lub Tab). Wcięcie jest OBOWIĄZKOWE — Python używa go zamiast nawiasów klamrowych. Kod poza wcięciem wykonuje się zawsze.temperatura = 35
if temperatura > 30:
print("Goraco! Pij duzo wody.")
print("Unikaj slonca.")
print("Ten kod wykonuje sie zawsze.") # poza if
if — Python wymaga dokładnie 4 spacje (lub 1 Tab). Mieszanie spacji i tabów też powoduje błąd.Liczba dodatnia, Koniec programu.if, tylko Sprawdzono.if z prawidłowym wcięciem (4 spacje)if może się nie wykonać wcaleelse to "w przeciwnym razie" — wykonuje się gdy warunek w if jest fałszywy. Dokładnie jedna z dwóch gałęzi zawsze się wykona.liczba = int(input("Podaj liczbe: "))
if liczba % 2 == 0:
print(f"{liczba} jest parzysta.")
else:
print(f"{liczba} jest nieparzysta.")
# Dokladnie jedna galaz ZAWSZE sie wykona
Bledne haslo. Sprobuj ponownie.if/elseelif to skrót od "else if" — kolejny warunek do sprawdzenia. Python wykonuje pierwszy pasujący blok i pomija resztę. Możesz mieć dowolną liczbę elif. Różnica od wielu if: elif przerywa po pierwszym dopasowaniu.ocena = int(input("Podaj ocene (1-6): "))
if ocena == 6:
wynik = "Celujacy!"
elif ocena == 5:
wynik = "Bardzo dobry"
elif ocena == 4:
wynik = "Dobry"
elif ocena == 3:
wynik = "Dostateczny"
elif ocena == 2:
wynik = "Dopuszczajacy"
else:
wynik = "Niedostateczny"
print(f"Ocena {ocena}: {wynik}")
if sprawdza każdy warunek niezależnie. elif przerywa po pierwszym dopasowaniu. Gdy warunki mogą się nakładać, to robi dużą różnicę.Witaj!if/elif/elseif a elifand to "i" — oba muszą być spełnione (wyjść z domu i mieć klucz). or to "lub" — wystarczy jedno (gotówka lub karta). not to "nie" — odwraca odpowiedź.and — True tylko gdy oba warunki True. or — True gdy przynajmniej jeden True. not — odwraca: not True == False, not False == True.wiek = 20
prawo_jazdy = True
if wiek >= 18 and prawo_jazdy:
print("Mozesz prowadzic!")
gotowka = 0
karta = 50
if gotowka > 0 or karta > 0:
print("Masz czym zaplacic.")
deszcz = False
if not deszcz:
print("Nie bierz parasola.")
wiek >= 16 AND (zna_podstawy OR ma_doswiadczenie). Stwórz zmienne i sprawdź 3 kombinacje: (18, True, False), (14, True, True), (16, False, False). Oczekiwane wyniki: True, False, False.and, or, notand wymaga obu True, or wymaga jednegoif wewnątrz innego if. Każdy poziom = dodatkowe wcięcie. Maksymalnie 2–3 poziomy dla czytelności. Głębsze zagnieżdżenia zastąp and.wiek = int(input("Wiek: "))
bilet = input("Masz bilet? (tak/nie): ")
if wiek >= 18:
if bilet == "tak":
print("Wejdz, prosze.")
else:
print("Kup bilet przy kasie.")
else:
print("Przepraszam, tylko dla doroslych.")
if A: if B: na if A and B:. Mniej wcięć, ten sam efekt.if: czy jest parzysta/nieparzysta). Dla ujemnych wypisz "Ujemna". Przetestuj dla 4, 7, -3. Następnie przepisz to samo używając and bez zagnieżdżenia.if (najpierw sprawdź login, potem hasło). Dla błędnego loginu wypisz "Nieznany uzytkownik", dla błędnego hasła — "Bledne haslo".if w if z max 2–3 poziomamiand zamiast zagnieżdżenia= (przypisanie) z == (porównanie)if z prawidłowym wcięciemif/else dla dwóch ścieżekif/elif/else dla wielu opcjiand, or, notif i wiedzieć kiedy użyć and zamiastNapisz program który oblicza BMI i wypisuje kategorię z poradą.
waga / (wzrost ** 2).if/elif/else do określenia kategorii (4 kategorie).:.1f)wynik1, wynik2... wynik10. Z listą: jedna zmienna wyniki przechowuje wszystkie. Listy to jedna z najważniejszych struktur w Pythonie.cwiczenie_m03_1.pypython cwiczenie_m03_1.pylasery = [] # pusta lista — na początku bez laserów
asteroidy = [[400, 50, 30], # każda asteroida = [x, y, rozmiar]
[200, 80, 45],
[600, 20, 55]]
lasery.append([statek_x, statek_y]) # nowy laser po SPACJI!
print(len(lasery), "laserów w powietrzu")
[...], elementy oddzielamy przecinkami. Dostęp do elementu: lista[indeks]. Indeks 0 to pierwszy element, -1 to ostatni. len() zwraca liczbę elementów.owoce = ["jablko", "banan", "gruszka", "mango"]
liczby = [10, 20, 30, 40, 50]
mieszana = [1, "dwa", 3.0, True] # rozne typy!
print(owoce[0]) # jablko (pierwszy)
print(owoce[-1]) # mango (ostatni)
print(owoce[-2]) # gruszka (przedostatni)
print(len(owoce)) # 4
owoce[4] gdy lista ma 4 elementy — indeksy to 0, 1, 2, 3.len(lista) - 1.temperatury = [22, 18, 25, 30, 15, 20, 28]. Wypisz temperaturę z poniedziałku (indeks 0), piątku (indeks 4) i ostatniego dnia (indeks -1). Oczekiwany wynik: 22, 15, 28.[i] i [-i]len() do sprawdzenia rozmiarulista[start:stop] — od indeksu start do stop-1. Pominięty start = od początku. Pominięty stop = do końca. Krok: [::2] co drugi element, [::-1] odwrócona lista.liczby = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
print(liczby[2:5]) # [20, 30, 40]
print(liczby[:3]) # [0, 10, 20] — pierwsze 3
print(liczby[7:]) # [70, 80, 90] — od 7 do konca
print(liczby[::2]) # [0, 20, 40, 60, 80] — co drugi
print(liczby[::-1]) # [90, 80, ..., 0] — odwrocona
print(liczby[-3:]) # [70, 80, 90] — ostatnie 3
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Wypisz: pierwsze 3, ostatnie 3, środkowe 4 (indeksy 3–6), co drugi element. Oczekiwane wyniki: [1, 2, 3], [8, 9, 10], [4, 5, 6, 7], [1, 3, 5, 7, 9].[::-1]) i wypisz co drugie imię z oryginalnej listy. Oczekiwany wynik: odwrócona lista i lista co 2 imion.[a:b], [:n], [n:][::2] i odwrócenia [::-1][-n:]append to dorzucenie czegoś do koszyka. remove to wyjęcie konkretnego przedmiotu po nazwie. pop to wzięcie ostatniej rzeczy z koszyka i zabranie jej ze sobą.append(val) dodaje na końcu, insert(i, val) wstawia na pozycji i, remove(val) usuwa pierwsze wystąpienie wartości, pop() usuwa i zwraca ostatni element (lub pop(0) — pierwszy).koszyk = ["chleb", "mleko"]
koszyk.append("maslo") # dodaj na koncu
koszyk.insert(1, "jajka") # wstaw na pozycji 1
print(koszyk) # ['chleb', 'jajka', 'mleko', 'maslo']
koszyk.remove("mleko") # usun po wartosci
ostatni = koszyk.pop() # usun i zwroc ostatni
print(ostatni) # maslo
print(koszyk) # ['chleb', 'jajka']
koszyk.remove("banan") gdy banan nie istnieje.if "banan" in koszyk: przed usunięciem.pop(0), wypisz kto odszedł i aktualną kolejkę. Potem dodaj 2 nowe osoby przez append() i wypisz końcowy stan. append(), insert(), remove(), pop()if x in listasum(), min(), max(), len() działają na listach. Metody listy: count(val) — ile razy wartość wystąpiła, index(val) — na jakiej pozycji. Operator in sprawdza czy element istnieje.oceny = [4, 5, 3, 5, 4, 2, 5, 3]
print(len(oceny)) # 8
print(sum(oceny)) # 31
print(min(oceny)) # 2
print(max(oceny)) # 5
print(oceny.count(5)) # 3 — ile razy 5
print(oceny.index(2)) # 5 — pozycja wartosci 2
print(5 in oceny) # True
srednia = sum(oceny) / len(oceny)
print(f"Srednia: {srednia:.2f}") # 3.88
[22, 18, 25, 30, 15, 20, 28]). Oblicz i wypisz: max, min, sumę, średnię (z 2 miejscami po przecinku). Oczekiwane wyniki: 30, 15, 158, 22.57.wyniki = [85, 92, 71, 88, 95, 71, 60]. Sprawdź: ile razy wynik 71 się powtarza, na jakiej pozycji jest wartość 88, czy 100 jest na liście. Oczekiwane wyniki: 2, 3, False.sum(), min(), max(), len()count(), index(), insort() to przesuwanie książek na półce według tytułu — zmienia oryginał na miejscu. sorted() to zrobienie fotografii półki i ułożenie kopii — oryginał zostaje niezmieniony..sort() modyfikuje oryginalną listę w miejscu i zwraca None. Funkcja sorted() zwraca nową posortowaną listę bez zmiany oryginału. Parametr reverse=True sortuje malejąco.imiona = ["Zofia", "Anna", "Bartek", "Marek"]
imiona.sort() # modyfikuje!
print(imiona) # ['Anna', 'Bartek', 'Marek', 'Zofia']
wyniki = [85, 92, 71, 88, 95]
posortowane = sorted(wyniki, reverse=True)
print(posortowane) # [95, 92, 88, 85, 71]
print(wyniki) # [85, 92, 71, 88, 95] bez zmian!
sort() zmienia listę w miejscu i zwraca None — zmienna będzie None!sorted(lista) gdy potrzebujesz przypisać wynik do zmiennej.[64, 25, 12, 22, 11]. Posortuj ją rosnąco (przez .sort()) i wypisz. Potem stwórz osobną zmienną z posortowaną malejąco kopią (przez sorted(..., reverse=True)) i wypisz obie. Oczekiwane wyniki: [11, 12, 22, 25, 64] i [64, 25, 22, 12, 11].input() z konwersją na int) do listy. Wypisz je posortowane rosnąco, malejąco i w oryginalnej kolejności. Oczekiwany wynik: trzy linie z listami..sort() — modyfikuje oryginałsorted() — tworzy nową listęreverse=Truefor element in lista: przechodzi przez każdy element po kolei. enumerate(lista) daje pary (indeks, wartość) — gdy potrzebujesz numeru. Pełna nauka pętli czeka w M04!owoce = ["jablko", "banan", "wisnia"]
for owoc in owoce:
print(f"Lubie {owoc}!")
print()
for i, owoc in enumerate(owoce):
print(f"{i+1}. {owoc}")
for i wypisz każde z numerem porządkowym przez enumerate(). Oczekiwany wynik: 1. Warszawa, 2. Krakow itd.ceny = [12.5, 8.0, 25.99, 5.5, 18.0]. Użyj pętli for i oblicz sumę ręcznie (przez akumulację: suma += cena). Wypisz każdą cenę i końcową sumę. Oczekiwana suma: 69.99.for x in lista:enumerate() gdy potrzebujesz numerulista[wiersz][kolumna]. Każdy wewnętrzny element to pełnoprawna lista — możesz na niej wywoływać wszystkie metody list.wyniki = [
["Anna", 92],
["Bartek", 85],
["Zofia", 97]
]
print(wyniki[0]) # ['Anna', 92]
print(wyniki[0][0]) # Anna
print(wyniki[1][1]) # 85
mapa = [
[0, 0, 1],
[0, 1, 0],
[1, 0, 0]
]
print(mapa[1][1]) # 1 — srodek mapy
[nazwa, cena] np. ["chleb", 3.5]. Wypisz każdy produkt w formacie Produkt: chleb | Cena: 3.50 zl używając pętli for i :.2f.".". Ustaw: plansza[0][0] = "X", plansza[1][1] = "O", plansza[2][2] = "X". Wypisz planszę (każdy wiersz w osobnej linii przez " ".join(wiersz)).lista[i][j]tuple) używa nawiasów okrągłych (). Po stworzeniu nie można jej modyfikować — to celowe! Używaj krotek gdy dane NIE powinny się zmieniać: współrzędne, kolory RGB, stałe konfiguracyjne. Unpacking pozwala przypisać elementy do zmiennych jedną linią.wspolrzedne = (52.23, 21.01) # Warszawa
rgb_czerwony = (255, 0, 0)
print(wspolrzedne[0]) # 52.23
print(rgb_czerwony) # (255, 0, 0)
# Unpacking
x, y = wspolrzedne
print(f"Szerokosc: {x}, Dlugosc: {y}")
r, g, b = rgb_czerwony
print(f"R={r}, G={g}, B={b}")
# wspolrzedne[0] = 100 <-- TypeError!
(nazwa, populacja_mln). Użyj pętli for i unpackingu (nazwa, pop = miasto) żeby wypisać każde w formacie Warszawa: 1.8 mln mieszkancow.wymiary = (1920, 1080) reprezentującą rozdzielczość ekranu. Wypakuj do zmiennych szerokosc i wysokosc. Oblicz i wypisz proporcje (szerokosc / wysokosc z 2 miejscami po przecinku) i całkowitą liczbę pikseli. Oczekiwany wynik: 1.78 i 2073600.()a, b = krotka[a:b], [::2], [::-1]append(), insert()remove(), pop()sum(), min(), max(), count(), index(), in.sort() (modyfikuje) vs sorted() (nowa lista)for x in lista i enumerate()Napisz program który zarządza listą uczestników kursu: dodaje ich, sortuje i wyświetla sformatowaną listę.
while True wczytuj imiona uczestników aż do wpisania "koniec".append), wypisz potwierdzenie.enumerate.if imie:)enumerate(lista, 1))for — gdy z góry wiesz ile razy powtórzyć lub po jakim zbiorze iterować. while — gdy powtarzasz dopóki jakiś warunek jest spełniony.cwiczenie_m04_1.pypython cwiczenie_m04_1.pywhile True: # game loop — 60 klatek na sekundę!
for laser in lasery:
laser[1] -= laser_predkosc # przesuń każdy laser w górę
# Usuń lasery poza ekranem (wzorzec filtrowania!)
lasery = [l for l in lasery if l[1] > -30]
for wrog in wrogowie:
wrog[0] += wrog_predkosc * wrog[2] # ruch AI wszystkich wrogów
range() to generator liczb — jak ktoś kto liczy głośno: "jeden, dwa, trzy...". Mówisz "licz od 1 do 5" i dostajesz po kolei 1, 2, 3, 4, 5.range(n) generuje 0, 1, ..., n-1. range(start, stop) od start do stop-1. range(start, stop, krok) z podanym krokiem (ujemny krok = odliczanie wstecz).for i in range(5):
print(i, end=" ") # 0 1 2 3 4
print()
for i in range(1, 6):
print(i, end=" ") # 1 2 3 4 5
print()
for i in range(0, 11, 2):
print(i, end=" ") # 0 2 4 6 8 10
print()
for i in range(5, 0, -1):
print(i, end=" ") # 5 4 3 2 1
print("START!")
range(1, 6). To bardzo częsty błąd na początku.7 x 1 = 7. Użyj pętli for i in range(1, 11). Oczekiwany wynik: 10 linii.range(n), range(a, b), range(a, b, krok)enumerate() to czytanie listy obecności — "1. Anna, 2. Bartek". zip() to zamek błyskawiczny — łączy dwie listy w pary: pierwszą z pierwszą, drugą z drugą.enumerate(lista) daje pary (indeks, wartość) — gdy potrzebujesz numeru przy każdym elemencie. zip(lista1, lista2) łączy dwie listy element po elemencie — przydatne gdy masz powiązane dane w dwóch listach.miasta = ["Warszawa", "Krakow", "Gdansk"]
populacje = [1.8, 0.8, 0.5]
for miasto in miasta:
print(f"Miasto: {miasto}")
print()
for i, miasto in enumerate(miasta):
print(f"{i+1}. {miasto}")
print()
for miasto, pop in zip(miasta, populacje):
print(f"{miasto}: {pop}M mieszkancow")
for i in range(len(lista)): lista[i] działa, ale jest mniej czytelne i podatne na błędy.enumerate() gdy potrzebujesz numeru.zip() żeby wypisać każdy w formacie 1. Chleb — 3.50 zl (z numerem przez enumerate(zip(...))). Oczekiwany wynik: 5 ponumerowanych linii.["Anna","Bartek","Zofia"] i [92, 85, 97]. Użyj zip() i enumerate() jednocześnie żeby wypisać miejsce, imię i wynik. Oczekiwany wynik: 1. Zofia: 97 pkt (posortowane malejąco po wynikach — użyj sorted(zip(...), key=...)).for x in listaenumerate() z numeremzip()while warunek: sprawdza warunek PRZED każdym powtórzeniem. Jeśli jest False od początku — pętla nie wykona się ani razu. Coś w pętli MUSI zmieniać warunek — inaczej pętla nigdy się nie skończy!licznik = 0
while licznik < 5:
print(f"Licznik: {licznik}")
licznik += 1 # BEZ TEGO — petla nieskonczona!
print()
haslo = ""
while haslo != "python123":
haslo = input("Podaj haslo: ")
print("Zalogowano!")
licznik += 1 lub brak zmiany warunku → pętla nigdy nie kończy.Brawo! Odgadles w 3 probach.Suma: 16, liczb: 3.while warunek:break to klawisz STOP — natychmiast wyjdź z pętli, koniec. continue to klawisz POMIŃ — przeskocz tę iterację i zacznij następną.break natychmiast wychodzi z pętli i kontynuuje kod po niej. continue pomija resztę bieżącej iteracji i skacze do następnej. Razem z while True: tworzą elastyczny wzorzec nieskończonej pętli z kontrolowanym wyjściem.for i in range(10):
if i == 5:
print("Znalazlem 5! Stop.")
break
print(i, end=" ") # 0 1 2 3 4
print()
for i in range(10):
if i % 2 == 0: # pominj parzyste
continue
print(i, end=" ") # 1 3 5 7 9
print()
while True:
opcja = input("Wybierz (1-info, 0-wyjdz): ")
if opcja == "0":
print("Do widzenia!")
break
elif opcja == "1":
print("Wersja 1.0")
[4, 5, 2, 3, 1, 5]. Użyj break żeby zatrzymać się gdy napotkasz ocenę mniejszą niż 2. Użyj continue żeby wypisać tylko oceny >= 3. Oczekiwane wyniki: zatrzymanie na ocenie 1, wypisanie [4, 5, 3, 5].while True z opcjami: 1 — wypisz powitanie, 2 — wypisz aktualną godzinę (możesz wpisać ją ręcznie), 0 — wyjdź. Pomiń wszystkie inne opcje przez continue. Oczekiwany wynik: menu działa w pętli do wpisania 0.break — natychmiast wychodzi z pętlicontinue — przeskakuje do następnej iteracjiwhile True: z breakliczby = [3, -1, 7, -4, 2, 8, -2, 5]
# AKUMULACJA
suma = 0
for x in liczby:
suma += x
print(f"Suma: {suma}") # 18
# FILTROWANIE
dodatnie = []
for x in liczby:
if x > 0:
dodatnie.append(x)
print(f"Dodatnie: {dodatnie}") # [3, 7, 2, 8, 5]
# SZUKANIE
for x in liczby:
if x == -4:
print("Znaleziono -4!")
break
# TRANSFORMACJA
kwadraty = [x**2 for x in liczby]
print(f"Kwadraty: {kwadraty}")
[22, -3, 18, 35, -5, 28, 15]: (a) suma, (b) tylko temperatury > 20, (c) znajdź pierwszą ujemną i wypisz jej pozycję, (d) zamień na Fahrenheit (C*9/5+32).["python", "java", "c", "rust", "go", "javascript"]. Zastosuj wzorce: (a) policz łączną liczbę liter (akumulacja przez len), (b) wypisz tylko słowa dłuższe niż 4 litery (filtrowanie), (c) zmień każde na wielkie litery (transformacja przez .upper()).print("Tabliczka mnozenian:")
for i in range(1, 6):
for j in range(1, 6):
print(f"{i*j:3}", end="")
print() # nowa linia po kazdym wierszu
print()
mapa = [
[".", ".", "#", "."],
[".", "#", "#", "."],
[".", ".", ".", "."],
]
for wiersz in mapa:
for pole in wiersz:
print(pole, end=" ")
print()
* o podanych wymiarach. Wejście: 5×3. Oczekiwany wynik: 3 linie po 5 gwiazdek.# o n wierszach (wiersz 1 = 1 znak, wiersz 2 = 2 znaki, ..., wiersz n = n znaków). Wejście: 5. Oczekiwany wynik: trójkąt 5 wierszy.[wyrażenie for x in kolekcja]. Z filtrem: [wyrażenie for x in kolekcja if warunek]. Zastępuje pętlę for z append — zwięźle i czytelnie dla prostych operacji.# Stara metoda — for + append
kwadraty = []
for i in range(1, 6):
kwadraty.append(i ** 2)
# List comprehension — to samo w 1 linii
kwadraty2 = [i**2 for i in range(1, 6)]
print(kwadraty) # [1, 4, 9, 16, 25]
print(kwadraty2) # [1, 4, 9, 16, 25]
# Z filtrem
parzyste = [x for x in range(20) if x % 2 == 0]
print(parzyste) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
oceny = [4, 5, 2, 3, 5, 1]
zdane = [o for o in oceny if o >= 3]
print(f"Zdane: {zdane}") # [4, 5, 3, 5]
["Anna","Bartek","Al","Zofia","Bo"] odfiltruj tylko te dłuższe niż 3 litery. Oczekiwane wyniki: [1, 9, 25, 49, 81, 121, 169, 225, 289, 361] i ["Anna","Bartek","Zofia"].[0, 20, 37, 100, -10]. Używając list comprehension przelicz każdą na Fahrenheit (C*9/5 + 32). Oczekiwany wynik: [32.0, 68.0, 98.6, 212.0, 14.0].[wyrażenie for x in lista][wyrażenie for x in lista if warunek]# ŹLE — Python pomija elementy!
liczby = [1, -2, 3, -4, 5]
for x in liczby:
if x < 0:
liczby.remove(x) # BUG: lista zmienia się podczas pętli
print(liczby) # [1, 3, -4, 5] — -4 nie zostało usunięte!
Gdy usuwasz z listy podczas iteracji po niej, Python traci pozycję — co drugi element może zostać pominięty.
# DOBRZE — budujemy nową listę
liczby = [1, -2, 3, -4, 5]
nowe = []
for x in liczby:
if x >= 0: # zachowaj tylko nieujemne
nowe.append(x)
liczby = nowe # zastąp starą listę nową
print(liczby) # [1, 3, 5]
# To samo jedną linią:
liczby = [1, -2, 3, -4, 5]
liczby = [x for x in liczby if x >= 0]
print(liczby) # [1, 3, 5]
lasery = [[400, 500], [200, -40], [600, 200]]
# Zachowaj tylko lasery wciąż na ekranie (y > -30)
lasery = [l for l in lasery if l[1] > -30]
print(lasery) # [[400, 500], [600, 200]]
# Laser [200, -40] zniknął — wyleciał poza górę!
[22, -5, 18, -12, 30, 0, 15]. Używając wzorca filtrowania (pętla + nowa lista) zostaw tylko temperatury powyżej zera. Oczekiwany wynik: [22, 18, 30, 15].[["goblin", 20], ["smok", 0], ["elf", 15], ["troll", 0]]. Używając list comprehension usuń wrogów z HP = 0 (martwych). Oczekiwany wynik: [["goblin", 20], ["elf", 15]].lista.remove() w pętli po tej samej liście jest błędemnowe = []; for x in lista: if warunek: nowe.append(x); lista = nowelista = [x for x in lista if warunek]range(n), range(a, b), range(a, b, krok) w pętli forenumerate() i zip()while warunek: z bezpieczną zmianą warunkubreak i continueNapisz program który wczytuje od użytkownika ciąg liczb i przeprowadza pełną analizę statystyczną.
while True wczytuj liczby (float) aż do wpisania "koniec". Obsłuż błędne wejście przez try/except ValueError.sorted(..., reverse=True)[:3]).:.2f)len(podlista)/len(dane)*100:.0f)# BEZ funkcji — powtarzamy kod
print("Cześć, Anna! Witaj w kursie.")
print("Cześć, Bartek! Witaj w kursie.")
print("Cześć, Zofia! Witaj w kursie.")
# Z funkcją — piszemy raz, używamy ile chcemy
def przywitaj(imie):
print(f"Cześć, {imie}! Witaj w kursie.")
przywitaj("Anna")
przywitaj("Bartek")
przywitaj("Zofia")
cwiczenie_m05_1.pypython cwiczenie_m05_1.pydef ruch_statku(klawisze):
global statek_x, statek_y # modyfikuje zmienne globalne
if klawisze[K_LEFT]:
statek_x -= predkosc
def sprawdz_kolizje():
global zycia, punkty # cała logika kolizji w jednym miejscu
for laser in lasery:
if laser_trafil(laser, wrogow):
punkty += 20
# Główna pętla staje się czytelna:
while True:
ruch_statku(klawisze)
sprawdz_kolizje()
def.def nazwa(): — dwukropek i wcięcie jak w if. Definicja NIE wykonuje kodu — tylko go zapamiętuje. Wywołanie: nazwa() — nawiasy są obowiązkowe! Dwa osobne momenty: definicja (raz) i wywołanie (dowolna liczba razy).def powiedz_hej():
print("Hej!")
print("Jestem funkcją.")
print("Mogę być wywoływana wielokrotnie.")
# Wywołania — kod z def wykonuje się dopiero teraz
powiedz_hej()
print("---")
powiedz_hej()
print("---")
powiedz_hej()
powiedz_hej (bez nawiasów) — to referencja do funkcji, NIE wywołanie. Python nie zgłosi błędu, ale nic się nie wykona!powiedz_hej() z nawiasami.
rysuj_linie() która wypisuje 20 myślników ("-" * 20). Wywołaj ją 3 razy. Oczekiwany wynik: trzy linie myślników.rysuj_ramke() która rysuje ramkę ASCII z * (4 linie: góra, dwa boki, dół) o szerokości 10 znaków. Wywołaj ją 2 razy. Oczekiwany wynik: dwie ramki jedna pod drugą.def()def. Przy wywołaniu podajemy argumenty. Parametr = nazwa w definicji; argument = konkretna wartość przy wywołaniu. Funkcja może mieć jeden, kilka lub zero parametrów.def przywitaj(imie):
print(f"Cześć, {imie}!")
przywitaj("Anna")
przywitaj("Bartek")
def przedstaw(imie, wiek):
print(f"Mam na imię {imie} i mam {wiek} lat.")
przedstaw("Zofia", 22)
przedstaw("Marek", 17)
przedstaw("Anna") gdy funkcja wymaga 2 argumentów — Python mówi dokładnie czego brakuje.oblicz_pole_prostokata(dlugosc, szerokosc) która wypisuje pole. Wywołaj ją dla (4, 5) i (10, 3). Oczekiwany wynik: Pole prostokata: 20, Pole prostokata: 30.podaj_info(produkt, cena, dostepny) która wypisuje: nazwa, cena z 2 miejscami po przecinku, status „jest" lub „brak". Wywołaj ją dla kawy (8.50, True) i herbaty (6.00, False).return to przekazanie wyniku do reszty programu, żebyś mógł go zapisać i użyć dalej.return funkcja zwraca None. Po return funkcja natychmiast kończy działanie. Różnica kluczowa: print() wypisuje na ekran, ale zwraca None. Jeśli chcesz użyć wartości w dalszym kodzie — musisz użyć return.def powitaj_bez(imie):
print(f"Cześć, {imie}!") # wypisuje, ale...
wynik = powitaj_bez("Anna")
print(wynik) # None — !
def dodaj(a, b):
return a + b # przekazuje wynik
wynik = dodaj(3, 4)
print(wynik) # 7
suma = dodaj(10, 20)
podwojna = dodaj(suma, suma) # wynik użyty dalej!
print(f"Suma: {suma}, podwojna: {podwojna}")
def sprawdz_wiek(wiek):
if wiek < 0:
return "Bledny wiek" # kończy funkcję tutaj
if wiek < 18:
return "Niepelnoletni"
return "Pelnoletni" # tylko gdy wiek >= 18
print(sprawdz_wiek(-5))
print(sprawdz_wiek(15))
print(sprawdz_wiek(25))
print() wypisuje tekst ale zwraca None. Jeśli chcesz używać wartości dalej, zwracaj ją przez return, nie przez print wewnątrz funkcji.
kwadrat(n) zwracającą n². Napisz szescian(n) zwracającą n³. Wywołaj obie i użyj wyników w obliczeniu: kwadrat(3) + szescian(2). Oczekiwany wynik: 17.max_z_dwoch(a, b) która zwraca większą z dwóch liczb (bez użycia wbudowanego max()). Przetestuj dla (5, 8), (10, 3), (7, 7). Oczekiwany wynik: 8, 10, 7.returnreturn funkcja zwraca Nonereturn natychmiast kończy funkcjęfunkcja(param=wartosc) — to argumenty kluczowe.def powitaj(imie, jezyk="pl"):
if jezyk == "pl":
print(f"Cześć, {imie}!")
elif jezyk == "en":
print(f"Hello, {imie}!")
else:
print(f"Hola, {imie}!")
powitaj("Anna") # domyślny jezyk: pl
powitaj("Tom", "en") # nadpisuje domyślne
powitaj("Carlos", "es")
def potega(podstawa, wykladnik=2):
return podstawa ** wykladnik
print(potega(5)) # 25 (domyślnie kwadrat)
print(potega(2, 10)) # 1024
def f(x=5, y): — parametry z wartościami domyślnymi muszą być na końcu.def f(y, x=5):
oblicz_vat(cena, stawka=0.23) zwracającą cenę brutto (cena * (1 + stawka)). Przetestuj z domyślną stawką (23%) i z stawka=0.08 (8%). Oczekiwany wynik dla ceny 100: 123.0 i 108.0.wypisz_wiersz(tekst, znak="=", szerokosc=30) która wypisuje tekst wyśrodkowany w ramce ze znakiem. Wywołaj ją z domyślnymi i ze zmienionymi argumentami. Oczekiwany format: ========= TYTUŁ =========.nazwa=wartośćreturn a, b to skrót od return (a, b) — Python pakuje je w krotkę. Można rozpakowywać bezpośrednio: x, y = funkcja(). Konwencja: _ jako nazwa dla wartości którą ignorujemy.def min_max(lista):
return min(lista), max(lista)
wynik = min_max([5, 2, 8, 1, 9, 3])
print(wynik) # (1, 9) — krotka
mn, mx = min_max([5, 2, 8, 1, 9, 3])
print(f"Min: {mn}, Max: {mx}")
def sekundy_na_czas(sekundy):
godziny = sekundy // 3600
minuty = (sekundy % 3600) // 60
sek = sekundy % 60
return godziny, minuty, sek
h, m, s = sekundy_na_czas(3725)
print(f"Czas: {h}:{m:02}:{s:02}")
_, maks = min_max([10, 5, 20, 3]) # ignoruj min
print(f"Maksimum: {maks}")
statystyki(lista) zwracającą krotkę (suma, srednia, min, max). Wywołaj ją dla [10, 20, 5, 15, 30] i rozpakuj wszystkie 4 wartości do osobnych zmiennych. Oczekiwany wynik: suma=80, srednia=16.0, min=5, max=30.podziel(a, b) zwracającą krotkę (wynik_calkowity, reszta) — czyli wynik dzielenia całkowitego i resztę (// i %). Dla 17 i 5 oczekiwany wynik: 3, 2.return a, bx, y = funkcja()_ do ignorowania niepotrzebnych wartościglobal. Zasada dobrego kodu: unikaj global — przekazuj przez parametry i return.def funkcja():
lokalna = "jestem lokalna"
print(lokalna) # OK
funkcja()
# print(lokalna) <-- NameError!
licznik = 0 # zmienna globalna
def zwieksz():
global licznik # deklaracja: modyfikuję globalną
licznik += 1
zwieksz()
zwieksz()
print(f"Licznik: {licznik}") # 2
# LEPSZY WZORZEC — bez global
def zwieksz_v2(n):
return n + 1
licznik2 = 0
licznik2 = zwieksz_v2(licznik2)
licznik2 = zwieksz_v2(licznik2)
print(f"Licznik2: {licznik2}") # 2
def f(): licznik += 1 — Python tworzy nową zmienną lokalną licznik zamiast modyfikować globalną. Błąd: UnboundLocalError.def f(n): return n + 1 + przypisanie poza funkcją.
akumuluj(lista) która sumuje elementy BEZ użycia global — przez parametr i return. Przetestuj dla [1, 2, 3, 4, 5]. Oczekiwany wynik: 15.test() z lokalną zmienną x = 42, wywołaj funkcję, a potem spróbuj wypisać x poza nią. Zapisz komunikat błędu.def oblicz_net(cena_brutto, vat=0.23):
return round(cena_brutto / (1 + vat), 2)
def oblicz_rabat(cena, procent):
return round(cena * (1 - procent / 100), 2)
def formatuj_cene(kwota):
return f"{kwota:.2f} zl"
def info_produktu(nazwa, cena_brutto, rabat=0):
cena_net = oblicz_net(cena_brutto) # wywołuje inne funkcje
print(f"=== {nazwa} ===")
print(f"Brutto: {formatuj_cene(cena_brutto)}")
print(f"Netto: {formatuj_cene(cena_net)}")
if rabat > 0:
po_rabacie = oblicz_rabat(cena_brutto, rabat)
print(f"Rabat {rabat}%: {formatuj_cene(po_rabacie)}")
info_produktu("Kawa", 9.99)
print()
info_produktu("Laptop", 2999.00, rabat=10)
pobierz_liczbe(komunikat) (wczytuje i zwraca float), oblicz_bmi(waga, wzrost) (liczy BMI = waga/wzrost²), kategoryzuj_bmi(bmi) (zwraca "Niedowaga"/"Norma"/"Nadwaga"/"Otylosc"). Połącz je w program który pyta użytkownika o wagę i wzrost i wypisuje BMI z kategorią."""Opis funkcji.""" wstawiasz bezpośrednio po linii def, przed pierwszą instrukcją. Wbudowana funkcja help(nazwa_funkcji) wypisuje docstring. Dobry docstring mówi: co robi, jakie parametry przyjmuje, co zwraca.def oblicz_bmi(waga, wzrost):
"""
Oblicza wskaznik BMI.
Parametry:
waga (float): waga w kilogramach
wzrost (float): wzrost w metrach
Zwraca:
float: wartosc BMI zaokraglona do 2 miejsc
"""
return round(waga / wzrost ** 2, 2)
def kategoryzuj_bmi(bmi):
"""Zwraca kategorie BMI jako string."""
if bmi < 18.5: return "Niedowaga"
elif bmi < 25.0: return "Norma"
elif bmi < 30.0: return "Nadwaga"
else: return "Otylosc"
bmi = oblicz_bmi(70, 1.75)
print(f"BMI: {bmi} — {kategoryzuj_bmi(bmi)}")
help() na jednej z Twoich funkcji i sprawdź jak wygląda wynik. Napisz docstring jako jeden wiersz (krótki opis) i jako wieloliniowy (z sekcjami Parametry i Zwraca).defhelp() do odczytania dokumentacji funkcjidef i wywoływać je z nawiasamireturnNapisz program który zbiera produkty od użytkownika i drukuje sformatowany paragon. Każda operacja to osobna funkcja — żadnego powtarzania kodu.
dodaj_produkt(nazwa, cena) — zwraca słownik {"nazwa": ..., "cena": ...}oblicz_sume(produkty) — zwraca sumę cen z listy produktówoblicz_vat(suma, stawka=0.23) — zwraca kwotę VAToblicz_rabat(suma, procent) — zwraca sumę po rabaciedrukuj_paragon(produkty, rabat_procent=0) — formatuje i wypisuje cały paragon używając poprzednich funkcjidrukuj_paragon()return:<20 i :>6.2f)try/except ValueError przy wczytywaniu cenycwiczenie_m06_1.py, cwiczenie_m06_2.py itd.tekst[-1] to ostatni znak, tekst[-2] to przedostatni. Slicing (tekst[start:stop]) wycina fragment: od indeksu start włącznie do stop wyłącznie. Podanie tylko jednej strony (tekst[3:] lub tekst[:5]) oznacza „od początku" lub „do końca".
tekst = "Python"
print(tekst[0]) # P — pierwszy znak
print(tekst[-1]) # n — ostatni znak
print(tekst[0:3]) # Pyt — od 0 do 2 (3 wyłączone)
print(tekst[2:]) # thon — od 2 do końca
print(tekst[:4]) # Pyth — od początku do 3
print(len(tekst)) # 6 — długość stringu
tekst[10] gdy string ma 6 znaków. Indeks musi być w zakresie 0 do len-1 (lub -len do -1).len() zanim odczytujesz konkretny indeks.
imie = "Aldric". Wypisz osobno: pierwszą literę, ostatnią literę, pierwsze 3 litery, string od drugiego znaku do końca. Oczekiwany wynik: A, c, Ald, ldric.haslo = "SuperTajne123". Wypisz go odwróconego (wskazówka: [::-1]) oraz pierwsze 5 znaków wielką literą (slice + .upper()). Oczekiwany wynik: 321enjaTerepuS i SUPER.[start:stop]len()print(). Najczęściej używane:
.upper() — wszystkie litery na wielkie.lower() — wszystkie litery na małe.strip() — usuwa spacje (i znaki nowej linii) z obu końców.replace(stare, nowe) — zamienia wszystkie wystąpienianapis = " Witaj Graczu! "
print(napis.upper()) # wynik: WITAJ GRACZU!
print(napis.lower()) # wynik: witaj graczu!
print(napis.strip()) # wynik: Witaj Graczu!
print(napis.strip().upper()) # wynik: WITAJ GRACZU!
tekst = "Ala ma kota. Ala go kocha."
print(tekst.replace("Ala", "Basia"))
napis.strip() — wynik ginie w powietrzu, napis nadal ma spacje!napis = napis.strip() albo print(napis.strip())
input()). Wypisz je wielką literą (upper), małą (lower) i z przyciętymi spacjami (strip). Wejście: anna . Oczekiwany wynik: ANNA, anna, anna.dialog = "Witaj [GRACZ], mam dla ciebie zadanie!". Podmień [GRACZ] na imię podane przez użytkownika przez .replace(). Wejście: Marek. Oczekiwany wynik: Witaj Marek, mam dla ciebie zadanie!.upper(), .lower(), .strip(), .replace()tekst.strip().lower()split() to nożyczki — tnie zdanie na listę słów. join() to klej — skleja listę słów z powrotem w jedno zdanie. startswith i endswith to linijka sprawdzająca czy napis zaczyna lub kończy się konkretnym fragmentem..split(sep) dzieli string po separatorze i zwraca listę. Bez argumentu dzieli po białych znakach. sep.join(lista) skleja elementy listy, wstawiając sep między każdą parę. .startswith() i .endswith() zwracają True lub False — przydatne do walidacji i parsowania komend.
zdanie = "idz na polnoc szybko"
slowa = zdanie.split()
print(slowa) # ['idz', 'na', 'polnoc', 'szybko']
print(slowa[0]) # idz — pierwsza część komendy
print(len(slowa)) # 4
polaczone = " | ".join(slowa)
print(polaczone) # idz | na | polnoc | szybko
komenda = "atak goblin"
print(komenda.startswith("atak")) # True
print(komenda.endswith(".py")) # False
jablko,chleb,mleko). Użyj split(",") i wypisz każdy element w osobnej linii. Oczekiwany wynik: jablko, chleb, mleko — każde w nowej linii."idz" i jeśli tak, wypisz kierunek (drugie słowo po split). Wejście: idz polnoc. Oczekiwany wynik: Idziesz w kierunku: polnoc..split()sep.join(lista)startswith / endswith{wartosc:.2f} — dwie cyfry po przecinku, {wartosc:>10} — wyrównanie do prawej na 10 znakach, {wartosc:<10} — do lewej. Używasz tego do tabelek, paragonów i pasków postępu.
cena = 9.5
ilosc = 3
suma = cena * ilosc
print(f"Cena jednostkowa: {cena:.2f} zl")
print(f"Suma: {suma:.2f} zl")
# Wyrównanie w kolumnach
produkty = [("Chleb", 3.5), ("Mleko", 2.8), ("Maslo", 6.99)]
for nazwa, kwota in produkty:
print(f"{nazwa:<10} {kwota:>6.2f} zl")
# Pasek postepu (HP, ladowanie)
hp = 65
hp_max = 100
pelne = int(hp / hp_max * 20)
puste = 20 - pelne
pasek = "█" * pelne + "░" * puste
print(f"HP: [{pasek}] {hp}/{hp_max}")
input()), a następnie wypisze paragon: kolumna nazwy (15 znaków, lewostronnie :<15), kolumna ceny (8 znaków, prawostronnie, 2 miejsca po przecinku). Oczekiwany format: Chleb 3.50 zl.█, puste = ░. Oczekiwany wynik: HP: [████████░░░░░░░░░░░░] 40/100.:.2f:<N i :>Nin mówi „znaleziono/nie znaleziono", find() pokazuje na której pozycji jest pierwsze wystąpienie, a count() liczy ile razy słowo pojawia się w tekście.fragment in tekst zwraca True lub False — najprostszy sposób sprawdzenia czy coś jest w stringu. .find(fragment) zwraca indeks pierwszego wystąpienia lub -1 gdy nie znalazł. .count(fragment) zlicza ile razy fragment pojawia się w tekście.
tekst = "spam jajka spam spam bekon"
print("spam" in tekst) # True
print("ziemniaki" in tekst) # False
print(tekst.find("jajka")) # 5 — indeks pierwszego znaku
print(tekst.find("ziemniaki")) # -1 — nie znaleziono
print(tekst.count("spam")) # 3
ala ma kota a kot ma ale, szukane: al. Oczekiwany wynik: True, 0, 2."atak". Jeśli tak — wypisz Atak wykonany!, jeśli nie — Nieznana komenda.in.find().count()for. Każda iteracja daje jedną literę. To pozwala na zliczanie liter, filtrowanie znaków czy budowanie nowych stringów na podstawie warunków.
slowo = "programowanie"
for litera in slowo:
print(litera, end=" ")
print() # nowa linia na końcu
# Policz samogloski
samogloski = "aeiouyąęó"
liczba = 0
for litera in slowo:
if litera in samogloski:
liczba += 1
print("Samoglosek:", liczba)
a (małe i wielkie — użyj .lower()). Wejście: Abrakadabra. Oczekiwany wynik: Litera 'a' pojawia sie 5 razy.python. Oczekiwany wynik: pythn.for litera in tekst\n to nowa linia, \t to tabulator."""...""". Możesz w nim używać normalnych enterów bez \n. Escape sequences to kombinacje ze znakiem backslash: \n — nowa linia, \t — tabulator, \\ — dosłowny backslash, \' i \" — cudzysłów wewnątrz stringu.
komunikat = """Wyniki rundy:
Gracz 1: 120 pkt
Gracz 2: 95 pkt
Gracz 3: 140 pkt"""
print(komunikat)
# Escape sequences
print("Linia 1\nLinia 2\nLinia 3")
print("Imie:\tAldric")
print("Sciezka: C:\\Games\\Python")
"""...""". Menu ma zawierać co najmniej 4 opcje (Nowa Gra, Wczytaj, Ustawienia, Wyjście), każda w osobnej linii, z numerem na początku.C:\Users\Gracz\save.dat) i wypisz go poprawnie (użyj \\ lub surowego stringa r"..."). Oczekiwany wynik: dosłowne backslashe na ekranie."""..."""\n, \t, \\ w stringachr"..."True lub False i działają na całym stringu: .isdigit() — czy same cyfry, .isalpha() — czy same litery, .isupper() — czy wszystkie wielkie, .islower() — czy wszystkie małe, .isspace() — czy same spacje. Przydają się do walidacji danych wejściowych od użytkownika.
wiek = input("Podaj wiek: ")
if wiek.isdigit():
wiek = int(wiek)
print("Wiek:", wiek)
else:
print("Wiek musi byc liczba!")
nick = input("Podaj nick (tylko litery): ")
if nick.isalpha():
print("Nick OK:", nick)
else:
print("Nick moze zawierac tylko litery!")
"-5".isdigit() → False (myślnik to nie cyfra)"3.14".isdigit() → False (kropka to nie cyfra)try/except float().
len()) i czy są to same cyfry (isdigit()). Jeśli oba warunki spełnione — wypisz PIN poprawny, w przeciwnym razie — Bledny PIN.not haslo.islower()) i ma co najmniej 8 znaków (len()). Wypisz każdy warunek osobno jako True/False..isdigit() i .isalpha().isupper() i .islower()isdigit() nie działa dla liczb ujemnych ani float[start:stop], [::-1].upper(), .lower(), .strip(), .replace().split() i sklejać przez sep.join():.2f, :<N, :>N)in, .find(), .count()for litera in tekst"""...""" i używać escape sequences.isdigit(), .isalpha(), .isupper()Napisz program — prostą grę tekstową z systemem komend. Gracz wpisuje komendy takie jak idz polnoc, atak goblin czy stan, a program je interpretuje i odpowiada.
"""...""".while True wczytaj komendę, użyj .strip().lower()..split() żeby wydzielić akcję (słowo[0]) i cel (słowo[1] jeśli istnieje).idz (z kierunkiem), atak (z nazwą wroga), stan (wypisz HP i lokację), koniec.atak wypisz informację z f-stringiem: f"Atakujesz {cel}! Zadajesz 15 obrazen."koniec.lower())Nie rozumiem: [komenda]stan wypisuje imię gracza, HP i aktualną lokację (przechowaj je w zmiennych)idz sprawdza czy kierunek to jedno z: polnoc / poludnie / wschod / zachod — jeśli nie, wypisz błądcwiczenie_m07_1.pycwiczenie_m07_2.py itd.{}, dict[key], get(){}, dict[key], get()
{"klucz": wartosc}. Dostęp przez slownik["klucz"]. Jeśli klucz nie istnieje — dostaniesz KeyError. Bezpieczniejsza wersja: slownik.get("klucz") zwraca None gdy klucz nie istnieje, albo slownik.get("klucz", domyslna) zwraca wartość domyślną.
gracz = {
"imie": "Aldric",
"hp": 100,
"mana": 50,
"poziom": 1
}
print(gracz["imie"]) # Aldric
print(gracz["hp"]) # 100
print(gracz.get("xp")) # None
print(gracz.get("xp", 0)) # 0
gracz["xp"] gdy klucz "xp" nie istnieje w słowniku — Python rzuca błąd.gracz.get("xp", 0) — zwróci 0 jeśli nie ma klucza, bez błędu.
"nazwa", "kalorie", "czas_przygotowania" (minuty), "ocena" (1–5). Wypisz każdą wartość z opisem. Oczekiwany format: Danie: Pizza | Kalorie: 800 | Czas: 30 min | Ocena: 5/5."cena" i "skladniki" (których nie ma) używając .get() z wartościami domyślnymi 0 i "brak". Program nie może rzucić KeyError.{}dict["klucz"].get(klucz, domyslna) zamiast ryzykować KeyErrorslownik["klucz"] = nowa — jeśli klucz istnieje, nadpisuje; jeśli nie — tworzy. Usunięcie: del slownik["klucz"] albo slownik.pop("klucz") (pop zwraca usuniętą wartość). Scalenie dwóch słowników: slownik.update(inny_slownik).
gracz = {"imie": "Aldric", "hp": 100, "poziom": 1}
gracz["hp"] -= 20 # zmiana istniejącego
print(gracz["hp"]) # 80
gracz["xp"] = 50 # dodanie nowego klucza
print(gracz["xp"]) # 50
del gracz["xp"] # usunięcie klucza
bonusy = {"atak": 15, "obrona": 8}
gracz.update(bonusy) # scalenie
print(gracz)
postac z kluczami "imie", "hp", "poziom". Zasymuluj walkę: odejmij 25 HP, dodaj klucz "xp" = 30, usuń klucz "poziom", dodaj "gold" = 10. Wypisz słownik po każdej operacji.bazowe = {"hp": 100, "mana": 50} i zbroja = {"obrona": 15, "hp": 120}. Użyj .update() żeby scalić je w słownik gracz. Wypisz finalne HP — sprawdź czy zostało nadpisane.dict["klucz"] = wartośćdel lub .pop().update()for k in slownik.keys() — po kluczach, for v in slownik.values() — po wartościach, for k, v in slownik.items() — po parach (najczęściej używane). Sprawdzenie czy klucz istnieje: k in slownik.
statystyki = {
"hp": 80,
"mana": 45,
"atak": 20,
"obrona": 12
}
for cecha in statystyki.keys():
print(cecha)
print("---")
for cecha, wartosc in statystyki.items():
print(f" {cecha:8}: {wartosc}")
oceny z 5 przedmiotami szkolnymi jako kluczami i ocenami (1–6) jako wartościami. Użyj .items() żeby wypisać każdy przedmiot z oceną. Na końcu wypisz średnią (zsumuj .values(), podziel przez len()).cennik = {"pizza": 25, "burger": 18, "sushi": 45, "kebab": 15}. Wypisz tylko produkty które kosztują mniej niż 20 zł. Oczekiwany wynik: burger, kebab..keys(), .values(), .items()k in slownikslownik["klucz1"]["klucz2"]. Typowy wzorzec to baza danych jako słownik słowników — zewnętrzny klucz to ID lub nazwa, wewnętrzny słownik to właściwości.
wrogowie = {
"goblin": {"hp": 20, "dmg": 5, "xp": 10},
"ork": {"hp": 50, "dmg": 12, "xp": 25},
"troll": {"hp": 100, "dmg": 20, "xp": 60}
}
print(wrogowie["goblin"]["hp"]) # 20
print(wrogowie["ork"]["dmg"]) # 12
for nazwa, stats in wrogowie.items():
print(f"{nazwa:8} HP:{stats['hp']:4} DMG:{stats['dmg']:3}")
wrogowie["smok"]["hp"] — jeśli "smok" nie istnieje, błąd pojawia się już na pierwszym kluczu.wrogowie.get("smok", {}).get("hp", 0) — dwa .get() z wartościami domyślnymi.
ksiazki z 3 tytułami jako kluczami. Każda książka to słownik z kluczami "autor", "rok", "ocena". Wypisz tabelkę: tytuł, autor, rok, ocena dla każdej książki.wrogowie z przykładu dodaj nowego wroga "smok" z hp=500, dmg=80, xp=300. Następnie odejmij 30 hp od goblina. Wypisz końcowe HP goblina i HP smoka.dict["k1"]["k2"]klucz in slownik jest szybsze niż szukanie w liście.
# LISTA — wyniki w kolejności
wyniki = [120, 95, 140, 88]
wyniki.sort(reverse=True)
print("1 miejsce:", wyniki[0]) # 140
# SŁOWNIK — dane z etykietami
gracz = {"imie": "Aldric", "hp": 80, "poziom": 3}
print(gracz["imie"], "- poziom", gracz["poziom"])
# Tworzenie słownika z dwóch list
miasta = ["Warszawa", "Krakow", "Gdansk"]
temp = [22, 18, 20]
pogoda = dict(zip(miasta, temp))
print(pogoda["Krakow"]) # 18
[["Ania", 5], ...]), potem jako słownik ({"Ania": 5, ...}). Wypisz ocenę ucznia "Bartek" z obu struktur. Która wersja jest czytelniejsza?produkty = ["pizza", "kebab", "sushi"], ceny = [25, 15, 45]. Stwórz słownik cennik = dict(zip(produkty, ceny)). Wypisz cenę pizzy i najtańszy produkt.klucz in slownik jest szybsze niż szukanie w liściedict(zip())licznik[element] = licznik.get(element, 0) + 1. Sprawdza czy klucz istnieje (jeśli nie — zwraca 0), a następnie dodaje 1 i przypisuje. Używasz tego do zliczania liter, słów, wyborów — wszędzie tam gdzie chcesz wiedzieć „ile razy".
tekst = "abrakadabra"
licznik = {}
for litera in tekst:
licznik[litera] = licznik.get(litera, 0) + 1
print(licznik)
# Posortuj od najczestszej
posortowane = sorted(licznik.items(),
key=lambda x: x[1],
reverse=True)
for litera, ile in posortowane:
print(f" '{litera}': {ile}")
.split() i słownika licznika). Wypisz wszystkie słowa z liczbą wystąpień. Wejście: ala ma kota a kot ma ale. Oczekiwany wynik: każde słowo z liczbą.d.get(k, 0) + 1sorted(d.items(), key=...)get() i setdefault()get() i setdefault()
get() czyta z wartością domyślną bez zapisywania. setdefault() czyta I zapisuje wartość domyślną gdy klucza nie ma.d.get(klucz, domyslna) — zwraca wartość lub domyślną, nie zmienia słownika.d.setdefault(klucz, domyslna) — jeśli klucz istnieje: zwraca jego wartość; jeśli nie istnieje: wstawia klucz z wartością domyślną i ją zwraca. Przydatne gdy budujesz słownik stopniowo.
gracz = {"imie": "Aldric", "hp": 100}
print(gracz.get("xp", 0)) # 0 — nie ma klucza
print(gracz) # "xp" nadal nie ma!
gracz.setdefault("xp", 0) # dodaje "xp" = 0
gracz.setdefault("hp", 999) # "hp" juz jest — nie zmienia
print(gracz["xp"]) # 0
print(gracz["hp"]) # 100 (nie nadpisane)
konfiguracja = {"tryb": "pelny"}. Użyj setdefault() żeby ustawić domyślne wartości dla brakujących kluczy: "glosnosc" → 50, "rozdzielczosc" → "1920x1080", "tryb" → "okno". Wypisz cały słownik — sprawdź który klucz NIE został nadpisany.[("Ania","3A"), ("Bartek","2B"), ("Celina","3A"), ("Damian","2B")]. Użyj setdefault(klasa, []) i .append() żeby zgrupować uczniów według klasy. Oczekiwany wynik: {"3A": ["Ania","Celina"], "2B": ["Bartek","Damian"]}.get() (nie zmienia) od setdefault() (zapisuje jeśli brak)setdefault() do budowania słownika grupującego{klucz: wartosc for element in iterable}. Możesz dodać filtr: {k: v for k, v in d.items() if v > 10}. To skrócona forma pętli for tworzącej słownik. Czytelny dla prostych transformacji — przy złożonej logice zostań przy zwykłej pętli.
ceny = {"pizza": 25, "burger": 18, "sushi": 45, "kebab": 15}
# Podwoj wszystkie ceny
drogie = {p: c * 2 for p, c in ceny.items()}
print(drogie)
# Filtruj — tylko produkty do 20 zl
tanie = {p: c for p, c in ceny.items() if c <= 20}
print(tanie)
# Z listy zrob slownik: slowo → dlugosc
slowa = ["python", "gra", "kod", "programowanie"]
dlugosci = {s: len(s) for s in slowa}
print(dlugosci)
oceny = {"Ania": 5, "Bartek": 3, "Celina": 6, "Damian": 2}. Używając dict comprehension stwórz nowy słownik zawierający tylko uczniów z oceną 4 lub wyższą. Oczekiwany wynik: {"Ania": 5, "Celina": 6}.[1, 2, 3, 4, 5]. Użyj dict comprehension żeby stworzyć słownik {liczba: liczba**2}. Oczekiwany wynik: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}.{k: v for ...}if w comprehension{} i odczytywać wartości przez dict["klucz"].get(klucz, domyslna) zamiast ryzykować KeyErrordel, .pop(), .update()).keys(), .values(), .items()dict["k1"]["k2"]d.get(k, 0) + 1setdefault() do bezpiecznego tworzenia kluczy{k: v for ...}Napisz program — sklep RPG gdzie gracz może przeglądać asortyment, kupować i sprzedawać przedmioty. Cały sklep i ekwipunek gracza zarządzany jest przez słowniki.
sklep z co najmniej 5 przedmiotami — każdy to zagnieżdżony słownik z kluczami "cena" i "opis".gracz z kluczami "imie", "zloto" = 100, "ekwipunek" = pusty słownik (przedmiot → ilość).wyswietl_sklep(sklep, gracz) — tabelka z cenami i stanem portfela gracza.kup(gracz, sklep, przedmiot) — sprawdza złoto, odejmuje cenę, dodaje do ekwipunku licznikiem (.get() + 1).sprzedaj(gracz, sklep, przedmiot) — sprawdza czy gracz ma przedmiot, dodaje 50% ceny do złota, odejmuje z ekwipunku.get() lub setdefault() (sekcja 7.7)