Shanraq.org Shanraq.org
Первая программа: числа, строки и вывод
IT

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 — разряды и ни одного знака после запятой.

Последняя строка — это вся денежная масса Казахстана. Без разрядов её невозможно прочитать, и в отчётах это будет отдельной темой.

Карта урока

Карта урока: числа, строки и вывод

Скажите своими словами

Не подглядывая, ответьте вслух или на бумаге. Ответы — в конце урока.

  1. Чем 7 / 2 отличается от 7 // 2 — и не только результатом?
  2. Почему " Хлеб ".strip() не меняет саму строку?
  3. Что делает двоеточие внутри фигурных скобок в 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.

Долги. Мы разрезали строку и получили список, но что с ним делать — не знаем: это урок про списки. Мы напечатали числа, но не сохранили их: переменные — следующий урок. И весь разбор чека пока делается вручную, строка за строкой, — до циклов ещё пять уроков.

Ответы

Показать ответы

На вопросы

  1. Результатом и типом: 7 / 2 — это 3.5, число с плавающей точкой; 7 // 2 — это 3, целое. Деление / всегда возвращает float, даже когда делится ровно; у // тип берётся от операндов, поэтому 7.0 // 2 — это 3.0.
  2. Потому что строки в Python неизменяемы: любой метод возвращает новую строку, а исходная остаётся прежней. Чтобы сохранить результат, его надо присвоить.
  3. Задаёт формат: сколько знаков после запятой (.2f), нужны ли разряды (,), и как выровнять. Само число при этом не меняется — меняется только то, как его показали.

К разминке

  1. 3.5 3 1. / всегда даёт дробное, // округляет вниз, % возвращает остаток. Три разных ответа на один вопрос «сколько».
3.5 3 1
  1. .2f. Точка с числом — сколько знаков после запятой, f — что печатать надо обычным числом, а не в научной записи.
print(f"{1 / 3:.2f}")
0.33
  1. + между строкой и числом Python не понимает: TypeError: can only concatenate str (not "int") to str. Числа с текстом соединяют запятой в print или f-строкой — она сама превратит число в текст:
print(f"итого: {780}")
итого: 780

Источники

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Проверить задание

Сначала решите и запустите в VS Code — редактор покажет ошибку на месте. Готовое решение вставьте сюда. Проверяет модель: она укажет на ошибку, но не даст готовый ответ.

Чтобы проверить, нужно войти. Войти

Комментарии (0)

Пока нет комментариев. Будьте первым.