Справочник по Python · модуль 1 · данные и имена
Глава 1.4
Параметры print():
sep и end
В прошлой главе print() дважды повёл себя «сам»: поставил пробел между значениями и перевёл строку в конце. И то и другое — не жёсткое правило, а значения по умолчанию, которые вы можете задать иначе.
- Категория
- Синтаксис и базовые концепции
- Уровень
- Начальный
- Связанные темы
- Вывод данных, строки, циклы
- Зачем это знать
- Управлять форматом вывода и собирать результат в одну строку
§1Параметры со значением по умолчанию
Кроме самих значений print() принимает именованные параметры — их передают по имени, через знак =, после всех выводимых значений. Два из них нужны постоянно:
| Параметр | За что отвечает | Значение по умолчанию |
|---|---|---|
sep | что ставится между значениями | " " — пробел |
end | что ставится в конце вывода | "\n" — перевод строки |
Значение по умолчанию — это то, что подставляется, когда вы параметр не указали. Поэтому print(a, b) и print(a, b, sep=" ", end="\n") работают одинаково: во втором случае значения параметров указаны явно.
§2sep — разделитель между значениями
Параметр sep (от separator) задаёт, чем разделяются значения, перечисленные через запятую.
print("яблоко", "бабочки", "огурцы")
яблоко бабочки огурцы
print("яблоко", "бабочки", "огурцы", sep="!! ")
яблоко!! бабочки!! огурцы
Разделителем может быть любая строка — символ, несколько символов или вообще пустая строка. Обратите внимание: он ставится только между значениями, но не в начале и не в конце.
print(1, 2, 3, sep=" - ") # 1 - 2 - 3 print("а", "б", "в", sep="") # абв — без разделителя print(2026, 9, 4, sep=".") # 2026.9.4
Последняя строка — типичное применение: собрать дату, путь или список через один и тот же знак, не расставляя его руками между каждой парой значений.
§3end — чем заканчивается вывод
Параметр end задаёт, что будет добавлено после всего выведенного. По умолчанию это перевод строки — поэтому каждый следующий print() начинается с новой строки.
print("Hello") print("world")
Hello world
Заменим перевод строки на пустую строку — и переноса не будет: следующий вывод продолжится там же, где закончился предыдущий.
print("Hello, ", end="") print("world!")
Hello, world!
В end можно положить не только пустую строку, но и любой текст — например, пробел:
print("Python", end=" ") print("Java", end=" ") print("C++")
Python Java C++
Заметьте: у последнего вызова end не задан. Он-то и переводит строку, завершая вывод. Если убрать перенос и у него, следующий вывод — или приглашение терминала — прилипнет к вашему тексту.
§4Что такое \n
Запись "\n" выглядит как два символа, но означает один — перевод строки. Обратный слеш здесь начинает управляющую последовательность: сочетание, которым записывают символ, не имеющий видимого начертания.
| Запись | Что означает |
|---|---|
\n | перевод строки — то, что происходит при нажатии Enter |
\t | табуляция, отступ до следующей позиции колонки |
\\ | сам обратный слеш |
\" | кавычка внутри строки в таких же кавычках |
Использовать их можно где угодно, не только в параметрах. Например, вывести каждое значение с новой строки одним вызовом:
print(1, 2, 3, sep="\n")
1 2 3
§5sep и end вместе
Оба параметра передаются в одном вызове, порядок между ними неважен — они именованные. Важно другое: сначала перечисляются все выводимые значения, и только потом идут параметры.
print(значение1, значение2, sep="разделитель", end="окончание")
print("итого", 4395, sep=": ", end=" руб.\n")
итого: 4395 руб.
Не увлекайтесь: тот же результат короче и понятнее даёт f-строка — print(f"итого: {total} руб."). Параметры sep и end хороши не для украшения одной строки, а там, где значений много или вывод собирается из нескольких вызовов.
§6Разбор задачи: вывод в строку
Настоящая польза от end видна, когда вызовов много и они идут не подряд в коде, а, например, в цикле. Циклы мы разберём в модуле 2, но идея видна и на трёх строках: без end="" каждый вывод занимал бы свою строку экрана, с ним — все складываются в одну.
print("Загрузка: ", end="") print("#", end="") print("#", end="") print("#", end="") print(" готово")
Загрузка: ### готово
Второй частый случай — sep для табличного вывода, где разделитель одинаков для всех колонок:
print("Иванов", "Python", 5, sep=" | ") print("Петров", "Python", 4, sep=" | ")
Иванов | Python | 5 Петров | Python | 4
Если разделитель одинаков для всех значений и их много — берите sep: один параметр вместо повторяющегося текста. Если между значениями разный текст — «Имя: …, возраст: …» — берите f-строку. Смешивать оба подхода в одном выводе можно, но читать такую строку тяжело.
§7Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
print(1, 2, sep = ", ", 3) | SyntaxError — значение стоит после именованного параметра | сначала все значения, потом параметры: print(1, 2, 3, sep=", ") |
print("a", "b", sep) | NameError — sep без = читается как имя переменной | print("a", "b", sep="-") |
print("a", "b", end) вместо end="" | то же самое: NameError | у именованного параметра всегда есть = и значение |
print("Загрузка", end="") и больше ничего | текст останется в одной строке с приглашением терминала | завершить вывод обычным print() |
print("C:\name") | выведет перевод строки: \n внутри пути сработал как управляющая последовательность | удвоить слеш: "C:\\name" |
print("a", "b", sep=", ", sep=" ") | SyntaxError — параметр указан дважды | оставить одно значение sep |
§8Проверьте себя
Что выведет print("a", "b", "c", sep="")?
abc. Пустая строка в качестве разделителя означает, что между значениями не ставится ничего. Перевод строки в конце при этом остаётся: за него отвечает end, а он не менялся.
Сколько строк займёт вывод: print("Hello", end=" "), затем print("world")?
Одну: Hello world. Первый вызов закончился пробелом вместо переноса, поэтому второй продолжил ту же строку и уже сам её завершил.
Чем отличается print(1, 2, 3, sep="\n") от трёх отдельных вызовов print(1), print(2), print(3)?
На экране — ничем, результат одинаковый: три строки. Отличие в коде: один вызов вместо трёх. Так удобно выводить набор значений, который у вас уже есть под рукой.
Почему в print("Python", end=" "), print("Java", end=" "), print("C++") у последнего вызова не задан end?
Потому что вывод нужно завершить переносом строки — иначе следующий текст в консоли прилипнет к C++. У последнего вызова end оставляют по умолчанию именно для этого.
Задача для практики: вывести дату 04.09.2026, имея три переменные — day = 4, month = 9, year = 2026.
Через sep: print(day, month, year, sep=".") — но получится 4.9.2026, без ведущих нулей. Чтобы вышло ровно 04.09.2026, нужна f-строка с указанием ширины: print(f"{day:02d}.{month:02d}.{year}"). Хороший пример того, где sep уже не хватает.
§9Шпаргалка
sep=" " между значениями
end="\n" в конце вывода
print(1, 2, 3, sep=" - ")
# 1 - 2 - 3
print("а", "б", sep="")
# аб
print("Hello, ", end="")
print("world!")
print(1, 2, 3, sep="\n")
\n перевод строки
\t табуляция
\\ сам слеш
Итог главы
У print() есть два параметра, которые обычно не указывают, потому что их значения по умолчанию подходят: sep=" " ставит пробел между значениями, end="\n" переводит строку в конце. Задав их явно, вы управляете форматом вывода: собираете дату через точку, печатаете значения столбиком или склеиваете несколько вызовов в одну строку. Для текста с разными подписями по-прежнему удобнее f-строка — sep и end берут своё там, где формат однороден.