6. Python – odbieranie danych od użytkownika


Szybki quiz – przypomnienie poprzedniej lekcji

1. Co zostanie wyświetlone?

x = 7
y = 2.0
print(x + y, type(x + y))
Odpowiedź

Odpowiedź: 9.0 <class 'float'>. Działanie int + float daje float.

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

ilosc = 3
print("Mam " + ilosc + " jabłka")
Odpowiedź

Odpowiedź: Operatorem + nie można łączyć str z int (TypeError). Poprawnie: str(ilosc) albo f-string: print(f"Mam {ilosc} jabłka").

3. Co zostanie wyświetlone?

print(bool(""), bool("0"), bool(0.0), bool([]))
Odpowiedź

Odpowiedź: False True False False. Napis "0" nie jest pusty, więc jest „prawdziwy”. Pozostałe wartości są „fałszywe”.

4. Dlaczego ten kod nie działa? Jak uzyskać napis python?

tekst = "Python"
tekst[0] = "p"
Odpowiedź

Odpowiedź: Stringi są niemutowalne (TypeError). Trzeba utworzyć nowy napis, np. tekst = tekst.lower().

5. Co zostanie wyświetlone?

print(int(3.99), int("12") + 1, float(4))
Odpowiedź

Odpowiedź: 3 13 4.0. int() ucina część dziesiętną, nie zaokrągla.

6. Co zostanie wyświetlone?

print(None == False, None is None)
Odpowiedź

Odpowiedź: False True. None to brak wartości, nie jest równe False. Na None sprawdzamy operatorem is.

Interakcja z użytkownikiem to kluczowy element wielu programów. Python umożliwia pobieranie danych od użytkownika za pomocą funkcji input(), która wstrzymuje wykonanie programu i czeka na wprowadzenie tekstu przez użytkownika.

Kluczowa zasada: Funkcja input() ZAWSZE zwraca typ str (string), niezależnie od tego, co użytkownik wpisze. Jeśli potrzebujesz liczby, musisz dokonać rzutowania.

Funkcja input()

Podstawowa składnia

zmienna = input()

Funkcja input():

  • Wyświetla kursor w konsoli
  • Czeka na wpisanie tekstu przez użytkownika
  • Pobiera tekst po naciśnięciu Enter
  • Zwraca wprowadzony tekst jako string
  • Przypisuje wartość do zmiennej

Najprostszy przykład

# Program czeka na input użytkownika
name = input()

# Użytkownik wpisuje np. "Jan" i naciska Enter
print(name)  # Jan

Sesja w konsoli:

Jan           użytkownik wpisał
Jan           program wyświetlił

Input z komunikatem (prompt)

Lepiej jest wyświetlić komunikat informujący użytkownika, co ma wpisać.

# Komunikat jako argument funkcji input()
name = input("Podaj swoje imię: ")
print(name)

Sesja w konsoli:

Podaj swoje imię: Jan
Jan

To jest znacznie lepsze niż:

# Stary sposób - dwie linie zamiast jednej
print("Podaj swoje imię:")
name = input()

Input zawsze zwraca string

# Użytkownik wpisuje liczbę
age = input("Podaj swój wiek: ")

# Sprawdzamy typ
print(type(age))  # <class 'str'>

# To jest string, nie liczba!
print(age)  # "25" (w cudzysłowach, bo to string)

Sesja w konsoli:

Podaj swój wiek: 25
<class 'str'>
25

Problem z obliczeniami

# Pobieramy "liczbę"
age = input("Podaj wiek: ")

# Próbujemy dodać
# result = age + 5  # TypeError: can only concatenate str to str

# To nie zadziała - age to string "25", nie liczba 25

Rzutowanie danych wejściowych

Konwersja na int

# Metoda 1: Rzutowanie po pobraniu
age_str = input("Podaj swój wiek: ")
age = int(age_str)

print(f"Za rok będziesz mieć {age + 1} lat")

# Metoda 2: Rzutowanie od razu (ZALECANE)
age = int(input("Podaj swój wiek: "))
print(f"Za rok będziesz mieć {age + 1} lat")

Sesja w konsoli:

Podaj swój wiek: 25
Za rok będziesz mieć 26 lat

Konwersja na float

# Pobieranie liczby zmiennoprzecinkowej
price = float(input("Podaj cenę produktu: "))

# Obliczanie z VAT
price_with_vat = price * 1.23

print(f"Cena z VAT: {price_with_vat:.2f} zł")

Sesja w konsoli:

Podaj cenę produktu: 100
Cena z VAT: 123.00 zł

Przykłady praktyczne

Przykład 1: Proste powitanie

print("Podaj swoje imię:")
name = input()

print("Witaj " + name + "!")
print("Dobrze Cię znowu gościć!")

Lepszy sposób (komunikat w input):

name = input("Podaj swoje imię: ")
print(f"Witaj {name}!")
print("Dobrze Cię znowu gościć!")

Sesja w konsoli:

Podaj swoje imię: Jan
Witaj Jan!
Dobrze Cię znowu gościć!

Przykład 2: Obliczenia z wiekiem

print("Podaj swój wiek:")
age = input()

# Rzutowanie na int przed obliczeniami
print("Jesteś ode mnie młodszy o", 38 - int(age), "lat")

Lepszy sposób:

age = int(input("Podaj swój wiek: "))
roznica = 38 - age
print(f"Jesteś ode mnie młodszy o {roznica} lat")

Sesja w konsoli:

Podaj swój wiek: 25
Jesteś ode mnie młodszy o 13 lat

Przykład 3: Kalkulator kwoty do zapłaty

print("Podaj kwotę:")
x = int(input())

print("Podaj ilość:")
y = int(input())

print("Kwota do zapłaty:", x * y)

Lepszy sposób:

price = float(input("Podaj cenę jednostkową: "))
quantity = int(input("Podaj ilość: "))

total = price * quantity

print(f"Kwota do zapłaty: {total:.2f} zł")

Sesja w konsoli:

Podaj cenę jednostkową: 19.99
Podaj ilość: 3
Kwota do zapłaty: 59.97 zł

Przykład 4: Pole prostokąta

# Pobieramy wymiary
dlugosc = float(input("Podaj długość prostokąta (cm): "))
szerokosc = float(input("Podaj szerokość prostokąta (cm): "))

# Obliczamy pole
pole = dlugosc * szerokosc

# Wyświetlamy wynik
print(f"Pole prostokąta wynosi: {pole} cm²")

Sesja w konsoli:

Podaj długość prostokąta (cm): 5.5
Podaj szerokość prostokąta (cm): 3.2
Pole prostokąta wynosi: 17.6 cm²

Przykład 5: Konwerter temperatur

# Pobieramy temperaturę w Celsjuszach
celsjusz = float(input("Podaj temperaturę w °C: "))

# Konwertujemy na Fahrenheita: F = C * 9/5 + 32
fahrenheit = celsjusz * 9/5 + 32

# Wyświetlamy wynik
print(f"{celsjusz}°C = {fahrenheit:.1f}°F")

Sesja w konsoli:

Podaj temperaturę w °C: 25
25.0°C = 77.0°F

Obsługa błędów przy input()

Problem – użytkownik wpisuje nieprawidłowe dane

# Użytkownik powinien wpisać liczbę
age = int(input("Podaj wiek: "))
# Jeśli wpisze "dwadzieścia" → ValueError!

Rozwiązanie – try-except

try:
    age = int(input("Podaj wiek: "))
    print(f"Masz {age} lat")
except ValueError:
    print("Błąd! Wpisz liczbę, nie tekst!")

Sesja z błędem:

Podaj wiek: dwadzieścia
Błąd! Wpisz liczbę, nie tekst!

Sesja poprawna:

Podaj wiek: 25
Masz 25 lat

Lepsze rozwiązanie – pętla z walidacją

while True:
    try:
        age = int(input("Podaj wiek: "))
        
        # Dodatkowa walidacja
        if age < 0 or age > 150:
            print("Wiek musi być między 0 a 150!")
            continue
        
        # Jeśli wszystko OK, wychodzimy z pętli
        break
        
    except ValueError:
        print("Błąd! Wpisz liczbę!")

print(f"Twój wiek: {age}")

Sesja z próbami:

Podaj wiek: abc
Błąd! Wpisz liczbę!
Podaj wiek: -5
Wiek musi być między 0 a 150!
Podaj wiek: 200
Wiek musi być między 0 a 150!
Podaj wiek: 25
Twój wiek: 25

Wiele danych wejściowych

Pojedynczo z opisami

# Dane osobowe
imie = input("Imię: ")
nazwisko = input("Nazwisko: ")
wiek = int(input("Wiek: "))
miasto = input("Miasto: ")

# Wyświetlanie
print("\n--- Podsumowanie ---")
print(f"Imię i nazwisko: {imie} {nazwisko}")
print(f"Wiek: {wiek}")
print(f"Miasto: {miasto}")

Kilka liczb na raz

# Opcja 1: Osobne inputy
a = int(input("Podaj pierwszą liczbę: "))
b = int(input("Podaj drugą liczbę: "))
c = int(input("Podaj trzecią liczbę: "))

suma = a + b + c
print(f"Suma: {suma}")

Split – podział stringa

# Użytkownik wpisuje wiele wartości rozdzielonych spacją
liczby_str = input("Podaj trzy liczby oddzielone spacją: ")

# Rozdzielamy string na listę
liczby_lista = liczby_str.split()

# Konwertujemy każdy element na int
a = int(liczby_lista[0])
b = int(liczby_lista[1])
c = int(liczby_lista[2])

suma = a + b + c
print(f"Suma: {suma}")

Split z list comprehension (zaawansowane)

# Elegancki sposób na wiele liczb
liczby_str = input("Podaj liczby oddzielone spacją: ")
liczby = [int(x) for x in liczby_str.split()]

print(f"Suma: {sum(liczby)}")
print(f"Średnia: {sum(liczby) / len(liczby)}")

PODSUMOWANIE

  • input() wstrzymuje program i czeka na tekst zakończony Enterem.
  • input() zawsze zwraca str, nawet gdy użytkownik wpisze 25.
  • Komunikat dla użytkownika podajemy jako argument: input("Podaj wiek: "). Nie rób osobnego print() przed input().
  • Liczbę uzyskujemy przez rzutowanie: int(...) dla całkowitych, float(...) dla ułamków. Zalecany zapis: age = int(input("...")).
  • Bez rzutowania + skleja napisy ("4" + "5" daje "45"), a * je powtarza ("4" * 3 daje "444").
  • int("3.7") i int("abc") kończą się ValueError. Błędne dane od użytkownika to normalna sytuacja, więc program powinien się na nią przygotować.
  • try / except ValueError przechwytuje błąd konwersji. Pętla while True z break pozwala pytać do skutku, a continue wraca do początku pętli.
  • Wiele wartości w jednej linii: input().split() zwraca listę napisów. Każdy element nadal trzeba przekonwertować.
  • Wynik z częścią dziesiętną formatujemy w f-stringu: {wartosc:.2f}.

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

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

  1. input() zawsze zwraca str.
  2. Do obliczeń rzutuj od razu: int(input("...")) lub float(input("...")).
  3. int dla liczb całkowitych, float dla cen, wymiarów, temperatur. int("3.7") zgłasza błąd.
  4. Bez rzutowania "4" + "5" daje "45", a "4" * 3 daje "444".
  5. Komunikat wpisujesz w nawiasie: input("Podaj wiek: ").
  6. Błędne dane (ValueError) obsługujesz przez try / except ValueError, a w pętli while True używasz break po poprawnych danych.
  7. input().split() daje listę napisów, które nadal trzeba przekonwertować.
  8. Wynik z dwoma miejscami po przecinku zapisujesz tak: f"{wynik:.2f}".

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

ZadanieZapis
Pobranie tekstuimie = input("Imię: ")
Pobranie liczby całkowitejwiek = int(input("Wiek: "))
Pobranie liczby z ułamkiemcena = float(input("Cena: "))
Sprawdzenie typutype(zmienna)
Wynik z 2 miejscami po przecinkuf"{wynik:.2f}"
Wiele wartości w jednej liniilista = input().split()
Wiele liczb (zaawansowane)liczby = [int(x) for x in input().split()]

Obsługa błędnej liczby:

try:
    n = int(input("Podaj liczbę: "))
    print(n * 2)
except ValueError:
    print("Błąd! Wpisz liczbę!")

Pytanie do skutku (walidacja):

while True:
    try:
        n = int(input("Podaj liczbę: "))
        break
    except ValueError:
        print("Błąd! Wpisz liczbę!")

Typowy schemat programu:

# 1. dane  ->  2. obliczenia  ->  3. wynik
a = float(input("a: "))
b = float(input("b: "))
wynik = a * b
print(f"Wynik: {wynik:.2f}")

Quiz – sprawdź się

1. Jaki typ zwraca funkcja input() i co otrzyma zmienna, jeśli użytkownik wpisze 25?

2. Użytkownik wpisuje kolejno 4 i 5. Co zostanie wyświetlone?

a = input()
b = input()
print(a + b)

3. Znajdź błąd i popraw kod.

age = input("Podaj wiek: ")
print(f"Za rok będziesz mieć {age + 1} lat")

4. Uzupełnij kod tak, aby cena mogła mieć ułamek, ilość była liczbą całkowitą, a wynik miał dwa miejsca po przecinku.

cena = ____(input("Cena: "))
ilosc = ____(input("Ilość: "))
print(f"Razem: {cena * ilosc____} zł")

5. Użytkownik wpisuje kolejno 2.5 i 4. Co zostanie wyświetlone?

a = float(input())
b = int(input())
print(a * b, type(a * b))

6. Użytkownik wpisał 3.7. Dlaczego program przerywa działanie? Jak go naprawić?

x = int(input("Liczba: "))

7. Która linia jest poprawna?

  • A) name = input(Podaj imię: )
  • B) name = input("Podaj imię: ")
  • C) name = "Podaj imię: ".input()
  • D) input("Podaj imię: ") = name

8. Co zostanie wyświetlone, gdy użytkownik wpisze abc, a co, gdy wpisze 12?

try:
    n = int(input("n: "))
    print(n * 2)
except ValueError:
    print("Błąd")

9. Użytkownik wpisuje 2 3 5. Co zostanie wyświetlone?

dane = input().split()
print(dane)
print(int(dane[0]) + int(dane[1]))

10. Napisz program, który pobiera trzy oceny (liczby całkowite) i wyświetla ich średnią z dokładnością do dwóch miejsc po przecinku. Sprawdź go dla ocen 5, 4, 4.

Odpowiedzi

1. Zwraca str. Zmienna otrzyma napis "25", a nie liczbę.

2. 45. Obie zmienne to napisy, więc + je skleja.

3. age jest napisem, więc age + 1 powoduje TypeError. Poprawnie: age = int(input("Podaj wiek: ")).

4. float, int, :.2f:

cena = float(input("Cena: "))
ilosc = int(input("Ilość: "))
print(f"Razem: {cena * ilosc:.2f} zł")

5. 10.0 <class 'float'>. Iloczyn float * int daje float.

6. int() nie potrafi zamienić napisu "3.7" na liczbę i zgłasza ValueError. Jeśli program ma przyjmować ułamki, użyj float(input(...)). Jeśli ma przyjmować tylko całkowite, dodaj try / except ValueError.

7. B. Komunikat musi być napisem w cudzysłowie, a input() to funkcja wywoływana z argumentem.

8. Dla abc wyświetli Błąd, bo int("abc") zgłasza ValueError. Dla 12 wyświetli 24.

9. Wyświetli dwie linie:

['2', '3', '5']
5

Elementy listy są napisami, dlatego przed dodaniem trzeba je przekonwertować.

10. Przykładowe rozwiązanie:

o1 = int(input("Ocena 1: "))
o2 = int(input("Ocena 2: "))
o3 = int(input("Ocena 3: "))

srednia = (o1 + o2 + o3) / 3
print(f"Średnia: {srednia:.2f}")

Dla 5, 4, 4 program wyświetla Średnia: 4.33. Nawiasy w (o1 + o2 + o3) / 3 są konieczne, bo dzielenie ma wyższy priorytet niż dodawanie.