Python: от данных до своей сводки Урок 3 из 56
Первая программа: числа, строки и вывод
Третий урок курса по Python. Считаем на магазинном чеке: два деления вместо одного, остаток, степень, а потом строки — обрезать, заменить, разрезать, склеить. И f-строки, которые кладут число внутрь текста: 52 751 740 084 727 ₸ с разрядами и 11,4% с одним знаком после запятой.
Зачем это нужно
Всё, что будет в курсе дальше — таблицы, графики, модели, — стоит на двух вещах: на числах и на строках. Данные приходят строкой, а ответ получается числом, и между ними лежит работа, которую делают каждый день.
Начнём с того, что у вас в кармане: с чека из магазина.
Сразу целиком
Файл chek.py в папке проекта. Запуск: python chek.py из окружения.
"""Урок 3: числа, строки и вывод — на одной строке из магазинного чека.
Ничего нового ставить не надо: это чистый Python. Строка с решёткой в начале —
комментарий, его читает человек, а не машина.
"""
# Одна строка чека: название, сколько взяли, цена за штуку.
LINE = " Хлеб ; 2 ; 260 "
print("== числа")
print("цена за штуку:", 260)
print("две штуки:", 260 * 2)
print("сдача с тысячи:", 1000 - 260 * 2)
print("тысяча на троих:", 1000 / 3)
print("сколько целых буханок на тысячу:", 1000 // 260)
print("сколько тенге останется:", 1000 % 260)
print("тысяча в квадрате:", 1000 ** 2)
print()
print("== строки")
print("как пришло:", repr(LINE))
print("без пробелов по краям:", repr(LINE.strip()))
print("маленькими буквами:", LINE.strip().lower())
print("другой разделитель:", LINE.strip().replace(";", "|"))
print("разрезано по точке с запятой:", LINE.strip().split(";"))
print("склеено обратно:", " / ".join(("хлеб", "молоко", "масло")))
print()
print("== f-строки: число внутри текста")
name = "хлеб"
count = 2
price = 260
print(f"{name}: {count} шт × {price} ₸ = {count * price} ₸")
print(f"инфляция за год: {11.3879454675914:.1f}%")
print(f"цена за штуку с точностью до тиына: {1890 / 3:.2f} ₸")
print(f"вся денежная масса страны: {52751740084726.9:,.0f} ₸")
print()
print("== два деления, и это разные вещи")
print("обычное:", 7 / 2, type(7 / 2))
print("нацело: ", 7 // 2, type(7 // 2))
Вывод:
== числа
цена за штуку: 260
две штуки: 520
сдача с тысячи: 480
тысяча на троих: 333.3333333333333
сколько целых буханок на тысячу: 3
сколько тенге останется: 220
тысяча в квадрате: 1000000
== строки
как пришло: ' Хлеб ; 2 ; 260 '
без пробелов по краям: 'Хлеб ; 2 ; 260'
маленькими буквами: хлеб ; 2 ; 260
другой разделитель: Хлеб | 2 | 260
разрезано по точке с запятой: ['Хлеб ', ' 2 ', ' 260']
склеено обратно: хлеб / молоко / масло
== f-строки: число внутри текста
хлеб: 2 шт × 260 ₸ = 520 ₸
инфляция за год: 11.4%
цена за штуку с точностью до тиына: 630.00 ₸
вся денежная масса страны: 52,751,740,084,727 ₸
== два деления, и это разные вещи
обычное: 3.5 <class 'float'>
нацело: 3 <class 'int'>
Разбор
print — единственное окно наружу
Пока программа ничего не печатает, она для вас не существует. print принимает сколько угодно значений через запятую и ставит между ними пробел.
Строка, начинающаяся с #, — комментарий: её читает человек, машина пропускает. Первые строки файла в тройных кавычках — тоже пояснение, но особого рода: это docstring, описание модуля, и до него доберёмся в уроке про функции.
Два деления, и путать их дорого
Посмотрите на последний блок вывода:
обычное: 3.5 <class 'float'>
нацело: 3 <class 'int'>
/ всегда даёт дробное число, даже когда делится нацело: 4 / 2 — это 2.0, а не 2. // округляет вниз — к меньшему числу, а не к нулю. На положительных числах это выглядит как «отбросить дробную часть»: 7 // 2 — это 3. На отрицательных видно, что правило другое: -7 // 2 — это -4, а не -3.
Округление и тип — разные вещи. Тип результата берётся от операндов: 7 // 2 — целое 3, а 7.0 // 2 — дробное 3.0. Дробная часть отброшена в обоих случаях, но float от деления нацело целым не становится.
Это не мелочь. «Сколько буханок по 260 ₸ помещается в тысячу» — это 1000 // 260, три штуки, и никаких «3,84 буханки». А % даёт то, что осталось: 220 тенге. Пара // и % — это ответ на вопрос «сколько целых и сколько сдачи», и он понадобится всюду: от страниц до времени.
** — возведение в степень: 1000 ** 2 — миллион.
Образ. Делёж лепёшек между людьми.
/— ответ бухгалтера: «по три с половиной».//— ответ хозяйки: «по три, и одна лишняя». Оба верны, но за столом нужен второй.
Строка — не то же самое, что то, что в ней написано
repr(LINE) показывает строку с кавычками и всеми пробелами: ' Хлеб ; 2 ; 260 '. Это важно: пробелы по краям не видны глазом, но ломают сравнение и превращают число в текст с мусором.
Четыре метода, которые вы будете применять к чужим данным ежедневно:
.strip()— убрать пробелы по краям. Не изменяет строку, а возвращает новую: строки в Python неизменяемы, и это спасает от целого класса ошибок;.lower()— привести к нижнему регистру, чтобы «Хлеб» и «хлеб» стали одним и тем же;.replace(старое, новое)— заменить;.split(разделитель)— разрезать на части. Вернулось['Хлеб ', ' 2 ', ' 260']— это список, и он же следующий урок. Обратите внимание: пробелы внутри частей остались,splitих не трогает.
И .join() — обратная операция: " / ".join(...) собирает части в одну строку через разделитель. Порядок здесь непривычный: разделитель первый, а не последний.
f-строки: число внутри текста
Приписать число к тексту плюсом нельзя — Python не станет угадывать, что вы имели в виду. Есть способ лучше:
print(f"{name}: {count} шт × {price} ₸ = {count * price} ₸")
Буква f перед кавычкой означает: внутри строки могут стоять фигурные скобки, и то, что в них, вычисляется. Внутри — не только имя, но и выражение: count * price посчиталось прямо на месте.
После двоеточия пишут, как показать число:
{11.3879454675914:.1f}→11.4— один знак после запятой;{1890 / 3:.2f}→630.00— два знака, как для денег;{52751740084726.9:,.0f}→52,751,740,084,727— разряды и ни одного знака после запятой.
Последняя строка — это вся денежная масса Казахстана. Без разрядов её невозможно прочитать, и в отчётах это будет отдельной темой.
Карта урока
Скажите своими словами
Не подглядывая, ответьте вслух или на бумаге. Ответы — в конце урока.
- Чем
7 / 2отличается от7 // 2— и не только результатом? - Почему
" Хлеб ".strip()не меняет саму строку? - Что делает двоеточие внутри фигурных скобок в f-строке?
Разминка
Три коротких шага перед заданием: предсказать, дописать, починить. Ответы — в конце урока, но сначала ответьте сами.
1. Предскажите. Что напечатает эта строка?
print(7 / 2, 7 // 2, 7 % 2)
2. Заполните пропуск. Вместо ... поставьте формат, при котором останется два знака после запятой.
print(f"{1 / 3:...}")
3. Почините. Программа падает. Прочитайте ошибку и сделайте так, чтобы строка напечаталась.
print("итого: " + 780)
Задание
Обязательное. Дано:
price = 260
count = 3
paid = 1000
Напечатайте пять строк: сколько стоит товар целиком; сколько сдачи с оплаченной суммы; сколько целых буханок помещается в оплаченную сумму и сколько останется; цену одной в долларах по курсу 540 с двумя знаками; и строку, в которой название, количество и сумма собраны f-строкой.
Ожидаемый вывод:
за товар: 780 тенге
сдача с 1000: 220 тенге
целых буханок на 1000: 3, останется 220
цена одной в долларах: 0.48
строка и число вместе: хлеб × 3 = 780
Готово, когда: вывод совпадает построчно; «целых и сдача» посчитаны через // и %, а не округлением; число нигде не приклеено к тексту знаком +.
На своих данных. Возьмите свой настоящий чек из магазина. Напишите программу, которая печатает: сумму за один товар (цена × количество), сдачу с круглой суммы, сколько таких товаров можно купить на тысячу тенге и сколько тенге при этом останется. Все числа выведите f-строками с двумя знаками после запятой.
По желанию.
- Посчитайте, сколько стоил бы тот же чек в 2010 году: разделите каждую цену на 3,48 — множитель из первого урока.
- Выведите одно и то же число тремя способами:
{x},{x:.2f},{x:,.0f}. Посмотрите, какой читается лучше. - Возьмите строку
" ЦЕНА ; 1 200,50 ; тг "и приведите её к видуцена;1200.50;тг— одними методами строк, без циклов.
Куда это встанет в проекте
Сегодняшнее — фундамент всего, что дальше: цены складываются, индексы делятся, а данные из мира приходят строкой, которую надо чистить. В следующем уроке разберёмся с типами: почему "260" и 260 — разные вещи, и почему 0.1 + 0.2 не равно 0.3.
Долги. Мы разрезали строку и получили список, но что с ним делать — не знаем: это урок про списки. Мы напечатали числа, но не сохранили их: переменные — следующий урок. И весь разбор чека пока делается вручную, строка за строкой, — до циклов ещё пять уроков.
Ответы
Показать ответы
На вопросы
- Результатом и типом:
7 / 2— это3.5, число с плавающей точкой;7 // 2— это3, целое. Деление/всегда возвращаетfloat, даже когда делится ровно; у//тип берётся от операндов, поэтому7.0 // 2— это3.0. - Потому что строки в Python неизменяемы: любой метод возвращает новую строку, а исходная остаётся прежней. Чтобы сохранить результат, его надо присвоить.
- Задаёт формат: сколько знаков после запятой (
.2f), нужны ли разряды (,), и как выровнять. Само число при этом не меняется — меняется только то, как его показали.
К разминке
3.5 3 1./всегда даёт дробное,//округляет вниз,%возвращает остаток. Три разных ответа на один вопрос «сколько».
3.5 3 1
.2f. Точка с числом — сколько знаков после запятой,f— что печатать надо обычным числом, а не в научной записи.
print(f"{1 / 3:.2f}")
0.33
+между строкой и числом Python не понимает:TypeError: can only concatenate str (not "int") to str. Числа с текстом соединяют запятой вprintили f-строкой — она сама превратит число в текст:
print(f"итого: {780}")
итого: 780
Источники
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.