Ввод, вывод и f-строки
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"{{фигурные скобки}} пишутся двойными")
Спецификатор формата: {значение:спецификатор}
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
Программа получает две строки ввода: имя и возраст. Выведите
Привет, <имя>! Через 10 лет вам будет <возраст + 10>.
Какие тесты проверяют код (1)
assert __stdout__.strip() == "Привет, Анна! Через 10 лет вам будет 38.", "Ожидается: Привет, Анна! Через 10 лет вам будет 38."
input() всегда возвращает строку — преобразуйте возраст через int().
name = input()
age = int(input())
print(f"Привет, {name}! Через 10 лет вам будет {age + 10}.")
x = 3.14159, n = 1234567. Что выведет f-строка?
| 3.14 | 1,234,567 | 3.1 | 003 | 31.4% | |
|---|---|---|---|---|---|
f"{x:.2f}" |
|||||
f"{n:,}" |
|||||
f"{x:5.1f}" |
|||||
f"{3:03d}" |
|||||
f"{x/10:.1%}" |
Напишите функцию price_tag(name, price), которая возвращает строку вида
"Кофе....... 199.90 ₽": название дополнено точками справа до 10 символов,
затем цена шириной 8 символов с двумя знаками после запятой, пробел и ₽.
Какие тесты проверяют код (2)
assert price_tag("Кофе", 199.9) == "Кофе...... 199.90 ₽"
assert price_tag("Чай", 50) == "Чай....... 50.00 ₽"
Формат {name:.<10} — выравнивание влево, заполнитель «.», ширина 10.
def price_tag(name, price):
return f"{name:.<10}{price:8.2f} ₽"
Что выведет print("a", "b", "c", sep="-", end="!")?
Чем repr(x) отличается от str(x)?
Войдите, чтобы отмечать пройденные уроки.