Към съдържанието
wannacode

Вход и изход

Проблем

Програмата знае само едно име

Програмата поздравява клиента по име:

name = "Мария"
print("Здравей, " + name + "!")
Изход
Здравей, Мария!

Работи, но поздравява всички като Мария. Името е записано в кода. За всеки нов клиент трябва да промениш програмата и да я пуснеш наново. Искаш програмата сама да попита.

Идеята

Четене от клавиатурата

Когато програмата чете, тя спира и чака. Човекът пише и натиска Enter. Написаното е входът на програмата.

greet.py
name = input("Как се казваш? ")
print("Здравей, " + name + "!")
Вход
Мария
Изход
Как се казваш? Здравей, Мария!

input("Как се казваш? ") печата въпроса в скобите, чака човекът да напише ред и Enter и връща написаното. Тук то се записва в name.

Входът и изходът тук са показани поотделно. В конзолата името ще се появи там, където го пишеш: след „Как се казваш? “. input печата въпроса, без да минава на нов ред: отговорът е на същия ред.

По-точно, за любопитните
  • input() без нищо в скобите само чете, без въпрос.
  • Ако входът е свършил (няма повече редове), input() спира програмата с EOFError.

Проблем

12 + 30 = 1230

Касиерът въвежда две плащания, 12 € и 30 €. Програмата трябва да покаже общата сума:

first = input()
second = input()
total = first + second
print("Общо: " + total + " €")
Вход
12
30
Изход
Общо: 1230 €

Вместо 42 излезе 1230. Програмата не е сбъркала сметката. Тя изобщо не е смятала.

Тук въпрос няма: input() само чете ред.

Идеята

От текст към число

Каквото и да напише човекът, input() връща текст. „12“ и „30“ са два текста, а + между текстове ги слепва. За да смяташ, превърни текста в число:

first = int(input())
second = int(input())
total = first + second
print(f"Общо: {total} €")
Вход
12
30
Изход
Общо: 42 €

Превръщането на текст в стойност от друг тип се казва парсване (parse).

  • int(...) дава int.
  • float(...) дава float.
  • Обратното, от число към текст, прави str(...).

Сборът влиза в текста с f-низ, защото Python не слепва текст с число.

Сумата тук е първата сметка в курса. Изваждане, умножение и деление идват в следващия урок.

first = int(input())
second = int(input())
total = first + second
print(f"Общо: {total} €")
Стъпка по стъпка, с думи
  1. Човекът пише 12 и Enter. input() връща текста "12", не число.
  2. int превръща текста в числото 12. То отива във first.
  3. 30 минава по същия път: текст, парсване, число в second.
  4. Сега + събира числа: 12 + 30 = 42.
  5. Отпечатва се „Общо: 42 €“.
По-точно, за любопитните
  • Ако текстът не е число (например „дванайсет“), програмата спира с ValueError. Интервалите отстрани не пречат: int(" 12 ") е 12. Как се хваща такава грешка, ще видим в модул „Грешки и изключения“.
print(int(" 12 "))
print(float("3.5"))
print(int("дванайсет"))
Изход
12
3.5
Traceback (most recent call last):
File "/home/student/sum.py", line 3, in <module>
print(int("дванайсет"))
^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'дванайсет'
  • float иска винаги точка, каквито и да са настройките на компютъра: float("3,5") спира с ValueError. int("3.5") също спира: дробното число не е цяло.

Пробвай

Колко билета?

Програмата чете колко са възрастните и колко са децата.

Вход
2
3

Какво ще отпечата програмата?

adults = int(input())
children = int(input())
print("Билети: " + adults + children)
Отговор

Идеята

Числата, както ги искаш

В миналия урок цената 49.90 излезе като 49.9. За цена искаш винаги два знака след десетичната точка. Това е форматиран изход:

product = "Слушалки"
price = 49.9
qty = 2
print(f"{product}: {price:.2f} €")
print(f"{qty} бр. в количката")
label = f"Цена: {price:.2f} €"
print(label)
Изход
Слушалки: 49.90 €
2 бр. в количката
Цена: 49.90 €

f-низът вече го познаваш: стойностите са във фигурни скоби, {product}. Това се казва интерполация на низове.

След стойността може да има двоеточие и формат: {price:.2f} значи дробно число с точно 2 знака след точката. .0f е без знаци след точката, .3f е с три.

f-низът не е само за печат. label = f"…" записва готовия текст в променлива.

Стойността в променливата не се променя. Форматът решава само как да изглежда, когато се печата.

По-точно, за любопитните
  • Хилядите и подравняването в колони:
total = 1234.5
print(f"Общо: {total:,.2f} €")
print(f"{'Кафе':<10}|{2.5:8.2f}")
print(f"{'Лаптоп':<10}|{1299.0:8.2f}")
Изход
Общо: 1,234.50 €
Кафе | 2.50
Лаптоп | 1299.00

, добавя разделител за хилядите. Числото преди точката е ширината: {2.5:8.2f} заема 8 знака, подравнено вдясно, а {'Кафе':<10} заема 10, подравнено вляво (<).

  • f-низовете не следват регионалните настройки: точката си е точка на всеки компютър. Ако искаш десетична запетая, както се пише у нас, сложи я изрично:
price = 49.9
print(f"Цена: {price:.2f} €".replace(".", ","))
Изход
Цена: 49,90 €

Пробвай

Два знака

Нощувката струва 65.5 €. Искаш да излезе „Нощувка: 65.50 €“. Какво трябва да пише на празното място?

print(f"Нощувка: {price:} €")

Пробвай

Намери грешката

Вече са запазени 12 билета, а програмата добавя още, колкото въведеш. При вход 4 тя спира на ред 3 с TypeError: unsupported operand type(s) for +: 'int' and 'str'. На кой ред е грешката?

Избери реда с грешката.

Упражнение

Програми, които питат

Реши задачите в редактора си. Входът е по един ред за всяка стойност. Не печатай въпроси като „Въведи име:“, за да съвпадне изходът ти с примерния: пиши input() без нищо в скобите.

1. Поздрав по име. Прочети име и поздрави.

Вход
Мария
Изход
Здравей, Мария!

2. Сума на две числа. Прочети две цели числа и отпечатай сметката.

Вход
17
25
Изход
17 + 25 = 42

3. Два текста в един. Прочети два текста и ги отпечатай заедно, с интервал между тях.

Вход
Велико
Търново
Изход
Велико Търново

4. π с два знака. Запиши π в променлива като 3.14159265358979 и го отпечатай с два знака след точката. Готовата стойност math.pi идва в следващия урок.

Изход
3.14

Още задачи

  • Възраст. Прочети име и възраст (цяло число) и отпечатай „Мария е на 19 години.“
  • Визитка от клавиатурата. Прочети име, професия и телефон и отпечатай визитката от урока „Първата програма“ с тях.
  • Цена с два знака. Прочети цена като дробно число и я отпечатай с два знака и знак за евро: при вход 7.5 изходът е Цена: 7.50 €.
  • Сума на две цени. Прочети две дробни цени и отпечатай сумата им с два знака: при вход 12.4 и 3.15 изходът е Общо: 15.55 €.

Тест

Провери се

1. Какво връща input()?
2. Прочетени са текстовете "12" и "30". Какво дава first + second?
3. Какво прави int("25")?
4. a = 2, b = 3. Какво прави print("Сума: " + a + b)?
5. Как се отпечатва 7.5 като 7.50?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·