Вход и изход
Проблем
Програмата знае само едно име
Програмата поздравява клиента по име:
name = "Мария"print("Здравей, " + name + "!")Здравей, Мария!Работи, но поздравява всички като Мария. Името е записано в кода. За всеки нов клиент трябва да промениш програмата и да я пуснеш наново. Искаш програмата сама да попита.
Идеята
Четене от клавиатурата
Когато програмата чете, тя спира и чака. Човекът пише и натиска Enter. Написаното е входът на програмата.
name = input("Как се казваш? ")print("Здравей, " + name + "!")МарияКак се казваш? Здравей, Мария!input("Как се казваш? ") печата въпроса в скобите, чака човекът да напише ред и Enter и връща написаното. Тук то се записва в name.
Входът и изходът тук са показани поотделно. В конзолата името ще се появи там, където го пишеш: след „Как се казваш? “. input печата въпроса, без да минава на нов ред: отговорът е на същия ред.
По-точно, за любопитните
input()без нищо в скобите само чете, без въпрос.- Ако входът е свършил (няма повече редове),
input()спира програмата сEOFError.
Проблем
12 + 30 = 1230
Касиерът въвежда две плащания, 12 € и 30 €. Програмата трябва да покаже общата сума:
first = input()second = input()total = first + secondprint("Общо: " + total + " €")1230Общо: 1230 €Вместо 42 излезе 1230. Програмата не е сбъркала сметката. Тя изобщо не е смятала.
Тук въпрос няма: input() само чете ред.
Идеята
От текст към число
Каквото и да напише човекът, input() връща текст. „12“ и „30“ са два текста, а + между текстове ги слепва. За да смяташ, превърни текста в число:
first = int(input())second = int(input())total = first + secondprint(f"Общо: {total} €")1230Общо: 42 €Превръщането на текст в стойност от друг тип се казва парсване (parse).
int(...)даваint.float(...)даваfloat.- Обратното, от число към текст, прави
str(...).
Сборът влиза в текста с f-низ, защото Python не слепва текст с число.
Сумата тук е първата сметка в курса. Изваждане, умножение и деление идват в следващия урок.
first = int(input())second = int(input())total = first + secondprint(f"Общо: {total} €")Стъпка по стъпка, с думи
- Човекът пише 12 и Enter. input() връща текста "12", не число.
- int превръща текста в числото 12. То отива във first.
- 30 минава по същия път: текст, парсване, число в second.
- Сега + събира числа: 12 + 30 = 42.
- Отпечатва се „Общо: 42 €“.
По-точно, за любопитните
- Ако текстът не е число (например „дванайсет“), програмата спира с
ValueError. Интервалите отстрани не пречат:int(" 12 ")е 12. Как се хваща такава грешка, ще видим в модул „Грешки и изключения“.
print(int(" 12 "))print(float("3.5"))print(int("дванайсет"))123.5Traceback (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")също спира: дробното число не е цяло.
Пробвай
Колко билета?
Програмата чете колко са възрастните и колко са децата.
23Какво ще отпечата програмата?
adults = int(input())children = int(input())print("Билети: " + adults + children)"Билети: " + adults, текст + число. Python не слепва текст с число и спира: TypeError: can only concatenate str (not "int") to str. Сумата влиза в текста с f-низ: f"Билети: {adults + children}" дава „Билети: 5“.Идеята
Числата, както ги искаш
В миналия урок цената 49.90 излезе като 49.9. За цена искаш винаги два знака след десетичната точка. Това е форматиран изход:
product = "Слушалки"price = 49.9qty = 2print(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.5print(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.9print(f"Цена: {price:.2f} €".replace(".", ","))Цена: 49,90 €Пробвай
Два знака
Нощувката струва 65.5 €. Искаш да излезе „Нощувка: 65.50 €“. Какво трябва да пише на празното място?
print(f"Нощувка: {price:} €").2f: дробно число с точно два знака след точката.
Пробвай
Намери грешката
Вече са запазени 12 билета, а програмата добавя още, колкото въведеш. При вход 4 тя спира на ред 3 с TypeError: unsupported operand type(s) for +: 'int' and 'str'. На кой ред е грешката?
Избери реда с грешката.
input() връща текст, "4". На ред 3 число се събира с текст и Python спира там. Но грешката е по-рано: прочетеното не е превърнато в число. Поправката е tickets = int(input("Брой билети: ")).Упражнение
Програми, които питат
Реши задачите в редактора си. Входът е по един ред за всяка стойност. Не печатай въпроси като „Въведи име:“, за да съвпадне изходът ти с примерния: пиши input() без нищо в скобите.
1. Поздрав по име. Прочети име и поздрави.
МарияЗдравей, Мария!2. Сума на две числа. Прочети две цели числа и отпечатай сметката.
172517 + 25 = 423. Два текста в един. Прочети два текста и ги отпечатай заедно, с интервал между тях.
ВеликоТърновоВелико Търново4. π с два знака. Запиши π в променлива като 3.14159265358979 и го отпечатай с два знака след точката. Готовата стойност math.pi идва в следващия урок.
3.14Още задачи
- Възраст. Прочети име и възраст (цяло число) и отпечатай „Мария е на 19 години.“
- Визитка от клавиатурата. Прочети име, професия и телефон и отпечатай визитката от урока „Първата програма“ с тях.
- Цена с два знака. Прочети цена като дробно число и я отпечатай с два знака и знак за евро: при вход
7.5изходът еЦена: 7.50 €. - Сума на две цени. Прочети две дробни цени и отпечатай сумата им с два знака: при вход
12.4и3.15изходът еОбщо: 15.55 €.
Тест