5. Python – typy danych


Szybki quiz – przypomnienie poprzedniej lekcji

Pytanie 1. Co zostanie wyświetlone?

print(17 // 5, 17 % 5)

Pytanie 2. Co zostanie wyświetlone?

print(-3 ** 2)
print((-3) ** 2)

Pytanie 3. Jaką wartość i jakiego typu będzie miała zmienna x po wykonaniu kodu?

x = 10
x /= 2

Pytanie 4. Znajdź błąd w kodzie i popraw go.

licznik = 0
licznik++

Pytanie 5. Co zostanie wyświetlone?

a = [1, 2]
b = [1, 2]
c = a
print(a == b, a is b, a is c)

Pytanie 6. Dlaczego ten kod nie działa? Podaj dwa sposoby naprawy.

wiek = 25
print("Wiek: " + wiek)
Odpowiedzi
  1. 3 2 – dzielenie całkowite daje 3, a reszta z dzielenia to 2.
  2. -9 i 9. Potęgowanie ma wyższy priorytet niż negacja, więc -3 ** 2 to -(3 ** 2).
  3. x ma wartość 5.0 i jest typu float, bo operator / zawsze zwraca float.
  4. W Pythonie nie ma operatora ++, więc kod zgłosi SyntaxError. Poprawnie: licznik += 1 lub licznik = licznik + 1.
  5. True False True. Zawartość a i b jest taka sama, ale to dwa różne obiekty. c wskazuje na ten sam obiekt co a.
  6. Operatorem + nie można łączyć stringa z liczbą (TypeError). Naprawa: "Wiek: " + str(wiek) albo f-string: f"Wiek: {wiek}".

Typ danych określa, jakiego rodzaju wartość przechowuje zmienna oraz jakie operacje można na niej wykonać. Python jest językiem dynamicznie typowanym – nie musisz deklarować typu zmiennej, interpreter sam go rozpoznaje na podstawie przypisanej wartości.

Podstawowe typy danych w Pythonie:

Numeryczne - int, float
Tekstowe - str (string)
Sekwencyjne - list, tuple, range
Mapujące - dict (dictionary)
Zbiory - set, frozenset
Logiczne - bool (True/False)
Specjalne - None

Sprawdzanie typu zmiennej

Funkcja type()

Funkcja type() zwraca typ zmiennej.

# Różne typy zmiennych
liczba_calkowita = 10
liczba_zmiennoprzecinkowa = 3.14
tekst = "Hello"
lista = [1, 2, 3]
prawda = True

# Sprawdzanie typów
print(type(liczba_calkowita))           # <class 'int'>
print(type(liczba_zmiennoprzecinkowa))  # <class 'float'>
print(type(tekst))                      # <class 'str'>
print(type(lista))                      # <class 'list'>
print(type(prawda))                     # <class 'bool'>

Funkcja isinstance()

Funkcja isinstance() sprawdza, czy zmienna jest instancją danego typu.

x = 10

# Sprawdzanie czy x jest typu int
print(isinstance(x, int))    # True
print(isinstance(x, float))  # False
print(isinstance(x, str))    # False

# Sprawdzanie wielu typów na raz
y = 3.14
print(isinstance(y, (int, float)))  # True (y jest float)

Typy numeryczne – int i float

Python ma tylko dwa podstawowe typy numeryczne, w przeciwieństwie do innych języków (Java, C++), które mają więcej (long, double, short itp.).

int – liczby całkowite

# Liczby całkowite
liczba = 1
print(type(liczba))  # <class 'int'>

# Python automatycznie obsługuje bardzo duże liczby
# (w innych językach to byłby long lub BigInteger)
duza_liczba = 9223372036854775807
print(type(duza_liczba))  # <class 'int'> - nadal int!

# Liczby ujemne
ujemna = -50
print(type(ujemna))  # <class 'int'>

float – liczby zmiennoprzecinkowe

# Liczby zmiennoprzecinkowe
number2 = 1.44
print(type(number2))  # <class 'float'>

# Bardzo precyzyjne liczby (w innych językach to byłby double)
double = 10.12345678910
print(type(double))  # <class 'float'> - nadal float!

# Notacja naukowa
wielka = 1.5e10  # 1.5 * 10^10 = 15000000000.0
print(wielka)
print(type(wielka))  # <class 'float'>

Automatyczna konwersja typów

Python automatycznie konwertuje typ gdy wykonujesz operacje na różnych typach numerycznych.

number = 1        # int
number2 = 1.44    # float

# Dodajemy int + float
result = number + number2
print(result)        # 2.44
print(type(result))  # <class 'float'>

# Reguła: int + float = float

Czytelny zapis dużych liczb

Dla czytelności możesz używać podkreślnika _ w dużych liczbach.

# Trudny do odczytania
trudny = 95256987128

# Czytelniejszy zapis
czytelny = 95_256_987_128

print(czytelny)  # 95256987128
# Podkreślniki są ignorowane, służą tylko czytelności

# Różne sposoby formatowania
milion = 1_000_000
miliard = 1_000_000_000
pi_dokladne = 3.141_592_653_589

Stringi – łańcuchy znaków

W Pythonie nie ma typu char (pojedynczy znak) jak w C++ czy Javie. Wszystko to stringi.

Tworzenie stringów

# Cudzysłowy podwójne
string1 = "Hello, World!"

# Apostrofy (cudzysłowy pojedyncze)
string2 = 'Hello, World!'

# Nie ma różnicy między " a '
print(type(string1))  # <class 'str'>
print(type(string2))  # <class 'str'>

Stringi wieloliniowe

Używaj potrójnych cudzysłowów lub apostrofów dla tekstów wieloliniowych.

# Potrójne cudzysłowy
tekst1 = """To jest długi tekst,
który rozciąga się
na wiele linii."""

# Potrójne apostrofy (to samo)
tekst2 = '''To jest długi tekst,
który rozciąga się
na wiele linii.'''

print(tekst1)

Stringi są niemutowalne

Ważne: Stringi w Pythonie są niemutowalne (immutable) – nie możesz zmienić ich zawartości. Musisz stworzyć nowy string.

tekst = "Hello"

# ŹLE - to nie zadziała
# tekst[0] = "h"  # TypeError: 'str' object does not support item assignment

# DOBRZE - tworzysz nowy string
tekst = "hello"  # Przypisujesz nowy string
print(tekst)

# Modyfikacja przez utworzenie nowego stringa
tekst = "Hello"
nowy_tekst = tekst.lower()  # Tworzy nowy string
print(nowy_tekst)  # hello
print(tekst)       # Hello (oryginalny się nie zmienił)

Łączenie stringów i liczb

Uwaga: Nie możesz łączyć operatorem + stringów z liczbami. Musisz dokonać rzutowania.

zmienna_int = 100
zmienna_string = "dolarów"

# ŹLE - błąd!
# print("Mam " + zmienna_int + " " + zmienna_string)  # TypeError

# DOBRZE - rzutowanie na string
print("Mam " + str(zmienna_int) + " " + zmienna_string)

# LEPIEJ - f-string (nie wymaga rzutowania)
print(f"Mam {zmienna_int} {zmienna_string}")

Boolean – True/False

Typ bool przechowuje wartość logiczną: True (prawda) lub False (fałsz).

# Deklaracja
logic_true = True
logic_false = False

print(logic_true)   # True
print(logic_false)  # False
print(type(logic_true))  # <class 'bool'>

Wartości „prawdziwe” i „fałszywe”

W Pythonie różne wartości są automatycznie konwertowane na True lub False.

  • False
  • None
  • 0 (zero)
  • 0.0 (zero float)
  • "" (pusty string)
  • [] (pusta lista)
  • () (pusta krotka)
  • {} (pusty słownik – {} to zawsze pusty słownik, a pusty zestaw tworzy się przez set())

Wszystkie inne wartości to True:

# Wartości False
print(bool(False))  # False
print(bool(None))   # False
print(bool(0))      # False
print(bool(""))     # False
print(bool([]))     # False

# Wartości True
print(bool(True))   # True
print(bool(1))      # True
print(bool("tekst"))# True
print(bool([1]))    # True (lista niepusta)

None – brak wartości

None to specjalny typ reprezentujący brak wartości. To nie to samo co 0, False ani pusty string.

# Deklaracja
message = None
print(message)  # None
print(type(message))  # <class 'NoneType'>

# Później możesz przypisać wartość
message = "Teraz mam wartość"
print(message)

# None != False
print(None == False)  # False
print(None == 0)      # False
print(None == "")     # False

# Sprawdzanie czy zmienna jest None
if message is None:
    print("Brak wiadomości")

Praktyczne zastosowanie:

def find_user(user_id):
    # Szukamy użytkownika...
    if user_id == 1:
        return {"name": "Jan", "age": 25}
    else:
        return None  # Nie znaleziono

user = find_user(5)
if user is None:
    print("Użytkownik nie znaleziony")
else:
    print(f"Znaleziono: {user['name']}")

Rzutowanie typów (casting)

Rzutowanie to konwersja wartości z jednego typu na inny.

int() – konwersja na liczbę całkowitą

# String → int
age = "25"
age = int(age)
print(age)        # 25
print(type(age))  # <class 'int'>

# Float → int (ucina część dziesiętną)
pi = 3.14
pi_int = int(pi)
print(pi_int)  # 3

# Bool → int
print(int(True))   # 1
print(int(False))  # 0

float() – konwersja na liczbę zmiennoprzecinkową

# String → float
price = "19.99"
price = float(price)
print(price)       # 19.99
print(type(price)) # <class 'float'>

# Int → float
liczba = 10
liczba_float = float(liczba)
print(liczba_float)  # 10.0

str() – konwersja na string

# Int → string
age = 25
age_str = str(age)
print(age_str)       # "25"
print(type(age_str)) # <class 'str'>

# Float → string
pi = 3.14
pi_str = str(pi)
print(pi_str)  # "3.14"

# List → string
lista = [1, 2, 3]
lista_str = str(lista)
print(lista_str)  # "[1, 2, 3]"

list(), tuple(), set() – konwersje kolekcji

# String → lista (rozdziela na znaki)
tekst = "Python"
lista = list(tekst)
print(lista)  # ['P', 'y', 't', 'h', 'o', 'n']

# Lista → krotka
lista = [1, 2, 3]
krotka = tuple(lista)
print(krotka)  # (1, 2, 3)

# Lista → zestaw (usuwa duplikaty)
owoce = ['jabłka', 'pomarańcze', 'jabłka', 'gruszki']
owoce_set = set(owoce)
print(owoce_set)  # {'jabłka', 'pomarańcze', 'gruszki'}

# Zestaw → lista
z_powrotem = list(owoce_set)
print(z_powrotem)

Ćwiczenia

Sprawdzanie typów

  1. Stwórz zmienną przechowującą swoją ulubioną liczbę i wyświetl jej typ używając funkcji type().
  2. Stwórz trzy zmienne: jedna z liczbą całkowitą, druga z liczbą zmiennoprzecinkową, trzecia z tekstem. Wyświetl typ każdej z nich.
  3. Stwórz zmienną z wartością True i sprawdź jej typ. Następnie przypisz do tej samej zmiennej liczbę 1 i ponownie sprawdź typ.
  4. Używając funkcji isinstance() sprawdź, czy zmienna zawierająca wartość 3.14 jest typu float. Wynik wyświetl w konsoli.
  5. Stwórz zmienną z wartością None. Sprawdź jej typ i użyj isinstance() aby potwierdzić, że nie jest to typ bool.

Typy numeryczne

  1. Stwórz dwie zmienne: jedną z liczbą całkowitą 10, drugą z liczbą zmiennoprzecinkową 3.5. Dodaj je do siebie i sprawdź typ wyniku.
  2. Zapisz liczbę 1 000 000 (milion) w czytelny sposób używając podkreślników i wyświetl ją w konsoli.
  3. Oblicz 2 do potęgi 16 i sprawdź typ wyniku.
  4. Podziel liczbę 17 przez 5 używając dzielenia zwykłego (/) i dzielenia całkowitego (//). Porównaj wyniki i ich typy.
  5. Znajdź resztę z dzielenia liczby 25 przez 7 używając operatora modulo.

Stringi

  1. Stwórz zmienną zawierającą twoje imię i nazwisko jako jeden string. Wyświetl ją w konsoli.
  2. Stwórz string wieloliniowy zawierający krótki wiersz (minimum 3 linijki) używając potrójnych cudzysłowów.
  3. Stwórz zmienną z tekstem „Python” i spróbuj zmienić pierwszą literę na małą „p” poprzez indeksowanie. Opisz co się stało.
  4. Połącz trzy stringi: swoje imię, spację i swoje nazwisko używając operatora +.
  5. Stwórz string „Hello” i powtórz go 5 razy używając operatora *.

Boolean i None

  1. Stwórz trzy zmienne: jedną z wartością True, drugą z wartością False, trzecią z wartością None. Wyświetl typ każdej z nich.
  2. Sprawdź wartość bool() dla następujących wartości i wyświetl wyniki: 0, 1, „”, „tekst”, [], [1, 2], {}, None.
  3. Stwórz zmienną z wartością None. Sprawdź czy jest równa None używając operatora „is”.
  4. Stwórz zmienną is_student = True. Użyj operatora „not” aby wyświetlić przeciwną wartość logiczną.
  5. Porównaj None == False i None is False. Wyświetl oba wyniki i wyjaśnij różnicę.

Rzutowanie typów

  1. Stwórz zmienną string „123” i przekształć ją na liczbę całkowitą. Wyświetl wynik i jego typ.
  2. Stwórz zmienną z liczbą zmiennoprzecinkową 3.14 i przekształć ją na string. Wyświetl wynik i jego typ.
  3. Stwórz zmienną z liczbą 5.99 i przekształć ją na int. Wyświetl wynik (zaobserwuj co się stało z częścią dziesiętną).
  4. Przekształć True na int i False na int. Wyświetl oba wyniki.

PODSUMOWANIE

  • Typ danych określa, jaką wartość przechowuje zmienna i jakie operacje można na niej wykonać. Python jest dynamicznie typowany: typ wynika z przypisanej wartości, a ta sama zmienna może później dostać wartość innego typu.
  • Typ sprawdzasz funkcją type(). Funkcja isinstance(x, typ) zwraca True lub False. Można podać kilka typów w krotce: isinstance(y, (int, float)).
  • Liczby: są tylko dwa typy, int i float.
    • int + float daje float.
    • Operator / zawsze daje float, a // przy dwóch liczbach int daje int.
    • int może być bardzo duży i nadal jest int.
    • 1.5e10 to float.
    • Podkreślnik w liczbie (1_000_000) służy tylko czytelności.
  • String (str): nie ma typu char, pojedynczy znak to też str. Cudzysłów i apostrof działają tak samo, a tekst wieloliniowy zapisujesz w """...""".
    • Stringi są niemutowalne: tekst[0] = "p" zgłasza TypeError. Metody (np. .lower()) zwracają nowy string i nie zmieniają oryginału.
    • Stringa z liczbą łączysz przez str() albo f-string.
  • Bool: wartości True i False piszemy wielką literą. Wartości traktowane jako fałsz to False, None, 0, 0.0, "", [], () i {}. Wszystkie pozostałe to prawda.
  • None oznacza brak wartości i jest typu NoneType. Nie jest równe 0, False ani "". Sprawdzamy go operatorem is (is None, is not None).
  • Rzutowanie tworzy wartość nowego typu, nie zmienia typu istniejącej wartości.
    • int() z float ucina część dziesiętną (nie zaokrągla).
    • int(True) daje 1, a int(False) daje 0.
    • str() zamienia na tekst.
    • list("Python") rozbija tekst na znaki.
    • set() usuwa duplikaty.
  • Typowe źródła błędów: "a" + 1, zapominanie, że / zwraca float, oczekiwanie, że int(5.99) da 6, == None zamiast is None.

Minimum, które powinno wejść w pamięć

Jeżeli masz zapamiętać tylko kilka rzeczy z tej lekcji, zapamiętaj te:

  1. Typ zmiennej wynika z wartości, a sprawdzisz go przez type().
  2. int + float = float, a / zawsze zwraca float.
  3. Stringi są niemutowalne, a str + int zgłasza TypeError. Używaj str() albo f-stringa.
  4. Fałszem są 0, 0.0, "", [], (), {}, None i False. Reszta to prawda.
  5. None sprawdzamy przez is None. Nie jest równe 0, False ani "".
  6. int(3.99) daje 3, bo ucina część dziesiętną.
  7. int(True) daje 1, a int(False) daje 0.
  8. set(lista) usuwa duplikaty.

Ściągawka – najważniejsze polecenia i składnia

TypPrzykładUwagi
int10, -50, 1_000_000dowolnie duże liczby
float3.14, 1.5e10kropka, nie przecinek
str"tekst", 'tekst', """wiele linii"""niemutowalny
boolTrue, Falsewielka litera
NoneTypeNonebrak wartości
list, tuple, set, dict[1], (1,), {1}, {"a": 1}omówione w lekcji 7

Sprawdzanie typu:

type(x)                       # <class 'int'>
isinstance(x, int)            # True / False
isinstance(x, (int, float))   # kilka typów naraz

Rzutowanie:

ZapisWynik
int("25")25
int(3.99)3 (ucina)
int(True) / int(False)1 / 0
float("19.99")19.99
float(10)10.0
str(25)"25"
list("abc")['a', 'b', 'c']
tuple([1, 2])(1, 2)
set([1, 1, 2]){1, 2} (kolejność elementów może być inna)
bool(x)True lub False według reguły prawda/fałsz

Łączenie tekstu z liczbą:

print("Mam " + str(n) + " zł")   # rzutowanie
print(f"Mam {n} zł")             # f-string

None:

if x is None: ...
if x is not None: ...

Quiz – sprawdź się

Pytanie 1. Który zapis tworzy zmienną typu float?

  • A) x = 10
  • B) x = 10.0
  • C) x = "10.0"
  • D) x = 1_0

Pytanie 2. Co zostanie wyświetlone?

a = 4
b = 2.5
print(a + b)
print(type(a + b))

Pytanie 3. Co zostanie wyświetlone?

print(7 / 2)
print(7 // 2)
print(type(8 / 2))

Pytanie 4. Co zostanie wyświetlone po wykonaniu kodu?

tekst = "Python"
tekst[0] = "p"
print(tekst)

Pytanie 5. Co zostanie wyświetlone?

tekst = "Hello"
nowy = tekst.lower()
print(tekst, nowy)

Pytanie 6. Uzupełnij kod tak, aby wyświetlił Zapłacono 100 zł:

kwota = 100
print("Zapłacono " + ______ + " zł")

Pytanie 7. Co zostanie wyświetlone?

print(bool(0), bool("0"), bool([]), bool([0]), bool(None))

Pytanie 8. Co zostanie wyświetlone?

x = None
print(x == False)
print(x is None)
print(type(x))

Pytanie 9. Co zostanie wyświetlone?

print(int(5.99))
print(int("12") + 3)
print(int(True) + int(False))

Pytanie 10. Znajdź błąd i popraw kod:

wynik = None
if wynik == None:
    print("Brak wyniku")

Kod działa, ale zapis jest niezgodny z konwencją. Co należy zmienić?

Pytanie 11. Co zostanie wyświetlone?

owoce = ["jabłko", "gruszka", "jabłko", "jabłko"]
print(len(set(owoce)))
print(list("abc"))

Pytanie 12. Zadanie praktyczne. Zmienna cena = "19.99" zawiera tekst. Napisz kod, który obliczy cenę po dodaniu 5 zł i wyświetli wynik jako 24.99.

Odpowiedzi
  1. B. 10.0 ma kropkę, więc jest float. Wariant A to int, C to str, a D (1_0) to int o wartości 10.
  2. 6.5 oraz <class 'float'> (int + float = float).
  3. 3.5, 3 oraz <class 'float'>. Operator / zawsze zwraca float, nawet gdy wynik jest całkowity (4.0).
  4. Nic się nie wyświetli, bo kod zgłosi TypeError: 'str' object does not support item assignment. Stringi są niemutowalne.
  5. Hello hello. Metoda .lower() zwraca nowy string i nie zmienia oryginału.
  6. str(kwota). Dopuszczalne jest też przepisanie linii jako f-string: print(f"Zapłacono {kwota} zł").
  7. False True False True False. "0" to niepusty tekst, więc jest prawdą. [0] to niepusta lista, więc też jest prawdą.
  8. False, True, <class 'NoneType'>. None nie jest równe False.
  9. 5, 15, 1. int(5.99) ucina część dziesiętną.
  10. Zamiast wynik == None należy użyć wynik is None.
  11. 2 oraz ['a', 'b', 'c']. Zestaw zawiera tylko dwa unikalne elementy.
  12. Przykładowe rozwiązanie:
cena = "19.99"
cena = float(cena) + 5
print(cena)   # 24.99

Tekst trzeba najpierw zamienić na float, bo "19.99" + 5 zgłosi TypeError.