6. Python – odbieranie danych od użytkownika


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)}")