Ввод, вывод и f-строки

⏱ 25 мин · 🧩 заданий: 5

print

print("Привет", "мир", 2024)            # значения через пробел
print("a", "b", "c", sep=" | ")         # свой разделитель
print("без перевода строки", end="")
print(" — продолжение")
print()                                  # пустая строка
import sys
print("в поток ошибок", file=sys.stderr) # stderr (в курсе показывается тоже)
Параметр По умолчанию Смысл
sep " " что вставлять между значениями
end "\n" что печатать в конце
file sys.stdout куда печатать (файл, sys.stderr)
flush False сразу сбросить буфер (для индикаторов прогресса)

input

input(prompt) читает строку из стандартного ввода (без \n на конце). Для чисел — преобразуйте.

#@stdin: Олег | 7 | 3 4 5
name = input("Как вас зовут? ")
n = int(input("Сколько лет опыта? "))
nums = list(map(int, input("Три числа: ").split()))
print(f"{name}: опыт {n}, сумма чисел {sum(nums)}")

Ввод в этом курсе

Если в примере есть input(), под кодом появится поле «Ввод»: каждая строка поля — ответ на очередной input(). Измените данные и запустите снова.

input().split() + map(int, ...) — стандартная идиома для чтения нескольких чисел в одной строке (часто нужна на олимпиадных платформах и в тестовых заданиях).

f-строки

f-строка (Python 3.6+) подставляет любые выражения в фигурных скобках:

name, price, qty = "Кофе", 199.9, 3
print(f"{name}: {qty} × {price} = {qty * price:.2f} ₽")
print(f"{name.upper()} {len(name)} {'да' if qty > 2 else 'нет'}")
print(f"{{фигурные скобки}} пишутся двойными")

Спецификатор формата: {значение:спецификатор}

{value : [заполнитель][выравнивание][знак][ширина][,][.точность][тип]} * < > ^ = + - 10 , .2 f d % e x b
x, n = 3.14159, 1234567
print(f"[{x:.2f}]  [{x:10.3f}]  [{x:<10.1f}]  [{x:^10.1f}]  [{x:*>10.1f}]")
print(f"[{n:,}]  [{n:_}]  [{n:>12,}]  [{0.256:.1%}]  [{n:.2e}]")
print(f"[{42:05d}]  [{42:+d}]  [{255:x}]  [{255:#x}]  [{5:b}]  [{5:08b}]")
print(f"[{'текст':>10}]  [{'текст':.<10}]  [{'длинный текст':.6}]")
Спецификатор Значение Пример → результат
.2f 2 знака после точки 3.14159 → 3.14
10 / <10 / ^10 / >10 ширина и выравнивание "ab":>5 → ab
, / _ разделитель тысяч 1234567 → 1,234,567
% процент 0.256:.1% → 25.6%
05d ведущие нули 42 → 00042
x, b, o, e шестнадцатеричный, двоичный, восьмеричный, экспонента 255:x → ff

Отладочный формат =

user_id, score = 42, 87.456
print(f"{user_id=}, {score=:.1f}, {user_id * 2 = }")

Python 3.8+: f"{x=}" печатает и выражение, и значение — удобно для быстрой отладки.

Таблица

rows = [("Анна", 28, 125000), ("Борис", 35, 98500.5), ("Вера", 41, 210000)]
print(f"{'Имя':<8}{'Возраст':>8}{'Зарплата':>12}")
print("-" * 28)
for name, age, salary in rows:
    print(f"{name:<8}{age:>8}{salary:>12,.0f}")

str и repr

s = "строка\nс переводом"
print(str(s))
print(repr(s))            # видно кавычки и \n
print(f"{s!r}")           # !r — подставить repr
import datetime
d = datetime.date(2024, 1, 15)
print(str(d), repr(d))
  • str(x) — для пользователя (print использует его).
  • repr(x) — для разработчика: однозначное, по возможности такое, что eval(repr(x)) == x. Его показывает REPL и отладчик.

Старые способы форматирования

Встречаются в старом коде и в логировании:

name, n = "Мир", 3
print("Привет, {}! Вам {} письма".format(name, n))
print("Привет, {name}! {n:03d}".format(name=name, n=n))
print("Привет, %s! Вам %d письма, %.1f%%" % (name, n, 99.5))

Логирование — исключение

В logging принято писать logger.info("Пользователь %s вошёл", user): строка форматируется только если сообщение действительно выводится. Подробнее — в уроке про логирование.

Итог

  • print(*values, sep=" ", end="\n", file=sys.stdout).
  • input() возвращает строку; числа — через int() / float(); несколько чисел — map(int, input().split()).
  • f-строки: {выражение:спецификатор} — ширина, выравнивание, точность, ,, %; {x=} для отладки.
  • str — для людей, repr — для разработчиков (!r).

Практика решено 0 из 5

Вы не вошли — ответы проверяются, но прогресс не сохранится. Войти или зарегистрироваться.
Задание 1 Программа на Python

Программа получает две строки ввода: имя и возраст. Выведите Привет, <имя>! Через 10 лет вам будет <возраст + 10>.

Какие тесты проверяют код (1)
assert __stdout__.strip() == "Привет, Анна! Через 10 лет вам будет 38.", "Ожидается: Привет, Анна! Через 10 лет вам будет 38."
Задание 2 Заполнить таблицу

x = 3.14159, n = 1234567. Что выведет f-строка?

3.141,234,567 3.100331.4%
f"{x:.2f}"
f"{n:,}"
f"{x:5.1f}"
f"{3:03d}"
f"{x/10:.1%}"
Отметьте ячейку — «+», пустая — «−».
Задание 3 Программа на Python

Напишите функцию price_tag(name, price), которая возвращает строку вида "Кофе....... 199.90 ₽": название дополнено точками справа до 10 символов, затем цена шириной 8 символов с двумя знаками после запятой, пробел и ₽.

Какие тесты проверяют код (2)
assert price_tag("Кофе", 199.9) == "Кофе......  199.90 ₽"
assert price_tag("Чай", 50) == "Чай.......   50.00 ₽"
Задание 4 Один вариант ответа

Что выведет print("a", "b", "c", sep="-", end="!")?

Задание 5 Один вариант ответа

Чем repr(x) отличается от str(x)?

Войдите, чтобы отмечать пройденные уроки.