Как управлять окончанием строки с помощью end

Раздел: Встроенные функции -> Параметры функции print

Параметр end: базовые возможности

Основное применение

По умолчанию функция print() добавляет символ новой строки \n в конце каждого вызова. Параметр end позволяет заменить этот символ на произвольную строку. Самое частое использование - подавление перевода строки с помощью end='', чтобы вывести несколько значений подряд на одной строке.

print('Hello', end='')
print('World')

Python print end (параметр end в print)

HelloWorld

В этом примере первый print заканчивается пустой строкой, поэтому второй print продолжает вывод сразу после 'Hello'.

Как вывести несколько значений через пробел без перевода строки?

Установите end=' ' (пробел). Тогда после каждого вызова будет добавляться пробел, и следующий вывод появится после него.

print('a', end=' ')
print('b', end=' ')
print('c')
a b c

Типичная ошибка:

После последнего вызова также добавляется пробел. Если это нежелательно, используйте sep или соберите строку методом join.

Решение: вывести все значения одним print с параметром sep=' ':

print('a', 'b', 'c', sep=' ')

Результат тот же, но без лишнего пробела в конце.

Как добавить табуляцию после каждого вывода?

Используйте end='\t'. Это полезно для вывода данных в колонки или для создания 'табличного' вида.

print('Имя', end='\t')
print('Возраст', end='\t')
print('Город')
Имя	Возраст	Город

Проблема: табуляция может отображаться по-разному в зависимости от настроек терминала. Для точного выравнивания лучше использовать форматирование строк с фиксированной шириной.

Как использовать произвольный разделитель между вызовами print?

Параметр end может содержать любую строку, например, end='... ' или end='|'.

print('Один', end='... ')
print('Два', end='... ')
print('Три')
Один... Два... Три

Таким образом можно создавать последовательности с нестандартным разделением.

Как комбинировать параметры sep и end?

Оба параметра работают вместе: sep определяет разделитель между значениями внутри одного вызова, а end - после всего вызова.

print('a', 'b', 'c', sep=' - ', end=' | ')
print('d', 'e', sep=' - ', end='')
a - b - c | d - e

Обратите внимание, что после первого вызова добавлен | , и второй вызов продолжил вывод сразу же.

Частая ошибка - путать sep и end. sep вставляет разделитель между переданными аргументами, а end - в самом конце. Если нужно разделить все выводимые значения единым символом, проще использовать sep в одном print.

Как вывести несколько строк подряд, но в итоге получить одну строку?

Используйте end='' во всех вызовах, кроме последнего. Или используйте sys.stdout.write для максимального контроля.

print('Часть1', end='')
print('Часть2', end='')
print('Часть3')
Часть1Часть2Часть3

Такой приём удобен при построении строки из частей внутри цикла.

Если в цикле много итераций, постоянный вызов print с end='' может быть неэффективным. Лучше накапливать строку в переменной и вывести один раз.

Как использовать end для вывода в файл?

Параметр end работает и при записи в файл через аргумент file. По умолчанию в файл также добавляется \n. Чтобы избежать этого, укажите end=''.

with open('output.txt', 'w') as f:
    print('Строка1', file=f, end='')
    print('Строка2', file=f)

В результате файл содержит Строка1Строка2\n.

Не забывайте про буферизацию. Для немедленной записи используйте flush=True.

Расширенные примеры использования end

В данном разделе представлены более сложные сценарии, где параметр end раскрывает свои возможности в сочетании с другими инструментами.

Пример 1: Эффект печатающейся строки (typewriter)

Параметр end в паре с flush=True и задержкой позволяет имитировать печать текста посимвольно.

Пример
import time

text = 'Привет, мир!'
for char in text:
    print(char, end='', flush=True)
    time.sleep(0.1)

Результат: символы появляются по одному с задержкой 0.1 секунды.

Привет, мир!

Пояснение:

Каждый символ выводится сразу (flush=True заставляет буфер сброситься), при этом end='' предотвращает переход на новую строку. После цикла строка остаётся на той же линии, и следующий вывод может её дополнить.

Пример 2: Прогресс-бар в консоли

С помощью end можно обновлять одну строку, имитируя полосу загрузки.

Пример
import time

total = 20
for i in range(total + 1):
    bar = '█' * i + '░' * (total - i)
    print(f'\\r{bar} {i*5}%', end='', flush=True)
    time.sleep(0.2)

Результат: строка прогресса обновляется на месте (символ возврата каретки \r переводит курсор в начало строки).

████████████░░░░░░░░ 70%

Важно:

Без end='' каждый print создавал бы новую строку. Комбинация end='' и \r позволяет перерисовывать одну и ту же строку.

Пример 3: Вывод таблицы с фиксированной шириной колонок

Параметр end помогает управлять разделением столбцов, когда используется цикл вывода.

Пример
headers = ['Имя', 'Возраст', 'Город']
data = [
    ['Анна', 25, 'Москва'],
    ['Петр', 30, 'Санкт-Петербург'],
    ['Мария', 28, 'Казань']
]

# Вывод заголовков
for h in headers:
    print(f'{h:20}', end='')
print()  # перевод строки после заголовков

# Вывод строк данных
for row in data:
    for cell in row:
        print(f'{str(cell):20}', end='')
    print()  # перевод строки после каждой записи

Результат:

Имя                   Возраст               Город                
Анна                  25                    Москва               
Петр                  30                    Санкт-Петербург      
Мария                 28                    Казань               

Объяснение:

Форматирование f'{str(cell):20}' задаёт минимальную ширину 20 символов для каждого значения, а end='' объединяет ячейки одной строки. После каждой строки данных выполняется print() без аргументов, который выводит только \n.

Пример 4: Логирование в файл с временными метками

Параметр end позволяет гибко управлять разделителями при записи в лог-файл, сохраняя структуру.

Пример
import time

fmt = '%H:%M:%S'
with open('log.txt', 'w') as log:
    for i in range(3):
        log.write(f'[{time.strftime(fmt)}] ')
        print(f'Событие {i+1}', file=log, end=' --- ')
    print('Готово', file=log)

Содержимое файла log.txt:

[14:30:01] Событие 1 --- [14:30:01] Событие 2 --- [14:30:01] Событие 3 --- Готово

Нюансы:

Здесь print(..., file=log, end=' --- ') заменяет стандартный перенос строки на --- после каждого сообщения, кроме последнего (где end по умолчанию - \n). Это удобно для создания последовательной записи.

Пример 5: Динамическое обновление нескольких строк с помощью cursor-управления

Сочетание end='' и управляющих последовательностей (ANSI) позволяет обновлять не только одну строку, но и несколько.

Пример
import time

print('Загрузка...')
for i in range(5):
    # Перемещаем курсор на одну строку вверх (\033[1A) и удаляем до конца строки (\033[K)
    print(f'\033[1A\033[KШаг {i+1}: {\"█\"*(i+1)}{\"░\"*(4-i)}', end='', flush=True)
    time.sleep(0.5)
print('\nГотово!')

Результат: строка 'Загрузка...' остаётся, а под ней каждая итерация перезаписывает предыдущую строку, имитируя прогресс.

Загрузка...
Шаг 5: █████

Предостережение:

Подобные приёмы зависят от терминала. На некоторых платформах (например, IDLE) могут работать некорректно.

Параметр end в print - comments

En
Python print end (python)