иконка discount

Скидка 15% по промокоду

кибер понедельник до 01.12иконка discount
CYBER2025
логотип PurpleSchool
логотип PurpleSchool

Команда python print - полное руководство по выводу данных

Автор

Олег Марков

Введение

Команда python print — это одна из первых функций, с которой вы сталкиваетесь в языке Python. Через нее вы видите результат работы программы, отлаживаете код и общаетесь с пользователем. Несмотря на простоту, у функции print есть много полезных возможностей, о которых часто забывают.

В этой статье вы разберете:

  • базовый синтаксис функции print;
  • как работает вывод нескольких значений;
  • параметры sep и end и почему они так важны;
  • управление перенаправлением вывода в файлы и потоки;
  • разные способы форматирования строк;
  • особенности работы с Юникодом и русским текстом;
  • практические приемы для отладки и логирования.

Смотрите, я покажу вам, как использовать print не только как инструмент для "показать что-то на экране", но и как удобный инструмент анализа работы программы.

Базовый синтаксис функции print

Что делает print в Python

Функция print выводит текстовое представление объектов в стандартный поток вывода (обычно это консоль) и по умолчанию добавляет перевод строки в конце. Проще говоря, она:

  1. Преобразует переданные значения в строки.
  2. Склеивает их через разделитель (sep).
  3. Выводит получившуюся строку в указанный поток (file).
  4. Добавляет завершение строки (end).

Сигнатура функции print

В Python 3 сигнатура функции выглядит так:

print(*objects, sep=" ", end="\n", file=None, flush=False)
# *objects  - произвольное количество значений для вывода
# sep       - строка-разделитель между значениями
# end       - строка, добавляемая в конце вывода
# file      - поток вывода (по умолчанию sys.stdout)
# flush     - немедленный сброс буфера (True/False)

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

Простейшее использование print

Вывод одной строки

Самый простой вариант — вывести строку:

print("Привет, мир")
# Вывод:
# Привет, мир

Здесь вы передаете один аргумент — строку. В конце автоматически добавляется перевод строки, поэтому следующий вывод начнется с новой строки.

Вывод чисел и выражений

Вам не нужно вручную преобразовывать числа в строки — print делает это сам:

x = 10
y = 20
print(x)
# Вывод:
# 10

print("Сумма:", x + y)
# Вывод:
# Сумма: 30

Обратите внимание: строка "Сумма:" и значение x + y передаются как два разных аргумента. Именно так работает разделение значений через запятую.

Вывод нескольких значений через запятую

Давайте посмотрим, как выглядит вывод нескольких аргументов:

name = "Анна"
age = 25
print("Имя:", name, "Возраст:", age)
# Вывод:
# Имя: Анна Возраст: 25

По умолчанию:

  • аргументы разделяются пробелом;
  • в конце добавляется перевод строки.

Все это можно настраивать через параметры sep и end.

Параметр sep — разделитель между значениями

Как работает sep

Параметр sep задает строку, которая будет вставлена между всеми объектами, переданными в print. По умолчанию это одиночный пробел.

print("a", "b", "c")
# Вывод:
# a b c

print("a", "b", "c", sep="-")
# Вывод:
# a-b-c

Здесь я меняю стандартный пробел на дефис, и вы сразу видите разницу.

Частые практические варианты использования sep

Формирование CSV-подобного вывода

print("id", "name", "age", sep=";")
# Вывод:
# id;name;age

Такой формат удобно потом парсить в других инструментах.

Формирование пути или пространств имен

parts = ["home", "user", "documents"]
print(*parts, sep="/")
# Вывод:
# home/user/documents

Здесь звездочка перед parts означает распаковку списка по позиционным аргументам, а sep задает разделитель.

Формат логов "через запятую"

user = "ivan"
action = "login"
status = "ok"

print(user, action, status, sep=",")
# Вывод:
# ivan,login,ok

sep с одним аргументом

Если передан только один объект, параметр sep не влияет на результат, так как разделять нечего:

print("Только одна строка", sep="***")
# Вывод:
# Только одна строка

Параметр end — что добавить в конце строки

Поведение по умолчанию

По умолчанию end равен символу переноса строки:

print("Первая строка")
print("Вторая строка")
# Вывод:
# Первая строка
# Вторая строка

Вывод без переноса строки

Если вы хотите продолжить вывод в той же строке, измените end:

print("Загрузка", end="")  # Не добавляем перевод строки
# Вывод: Загрузка

print("...", end="")       # Продолжаем на той же строке
# Вывод: Загрузка...

print(" готово")
# Вывод:
# Загрузка... готово

Здесь я оставляю end пустым, чтобы не добавлять ни пробела, ни перевода строки.

Добавление кастомного завершения

Можно использовать любой символ или строку:

print("Элемент 1", end="; ")
print("Элемент 2", end="; ")
print("Элемент 3", end=".\n")
# Вывод:
# Элемент 1; Элемент 2; Элемент 3.

Здесь вам не нужно вручную вставлять переводы строк через символ \n в середине строк — вы можете задать их в end.

Совместное использование sep и end

Давайте разберемся на примере, как они работают вместе:

print(1, 2, 3, sep=", ", end="; ")
print(4, 5, sep=" - ")
# Вывод:
# 1, 2, 3; 4 - 5
  • В первой строке числа разделены запятой и пробелом, в конце стоит точка с запятой и пробел.
  • Вторая строка выводится сразу после первой, без переноса строки между ними.

Параметр file — вывод не только на экран

Что такое file в print

Параметр file определяет, в какой поток вывода будет отправлен результат. По умолчанию используется sys.stdout — стандартный вывод (обычно это консоль).

Но вы можете указать любой объект, у которого есть метод write(str):

  • файл;
  • буфер в памяти;
  • собственный объект, реализующий интерфейс файла.

Вывод в файл

Покажу вам, как это реализовано на практике.

# Откроем файл для записи в текстовом режиме с кодировкой UTF-8
f = open("log.txt", "w", encoding="utf-8")

print("Старт программы", file=f)
print("Результат:", 42, file=f)

f.close()

Комментарии к коду:

  • open возвращает файловый объект.
  • Мы передаем его в параметр file.
  • print записывает строки не в консоль, а в файл log.txt.

Важно всегда закрывать файл через close или использовать контекстный менеджер with:

import time

# Используем контекстный менеджер чтобы файл закрылся автоматически
with open("log.txt", "a", encoding="utf-8") as f:
    print("Запуск задачи", time.time(), file=f)
    # Здесь мы логируем время в файл

Режим "a" означает добавление в конец файла, а не перезапись.

Использование sys.stdout и sys.stderr

Бывает полезно направлять разные типы сообщений в разные потоки:

  • sys.stdout — обычный вывод;
  • sys.stderr — сообщения об ошибках.
import sys

print("Обычное сообщение", file=sys.stdout)
# Это попадет в стандартный вывод

print("Сообщение об ошибке", file=sys.stderr)
# Это попадет в стандартный поток ошибок

Такой подход часто используют в консольных утилитах, где важно разделять основной вывод и ошибки.

Параметр flush — немедленный вывод

Зачем нужен flush

Обычно вывод буферизуется: данные сначала накапливаются в буфере, а затем выводятся "порциями". Это экономит ресурсы, но иногда вам нужно увидеть сообщение прямо сейчас, например:

  • в процессе длительной операции;
  • при пошаговом прогрессе;
  • для отладки зависаний.

Здесь помогает параметр flush.

import time

for i in range(5):
    print("Шаг", i, end=" ", flush=True)
    # flush=True заставляет сразу вывести текст
    time.sleep(1)

Если бы flush=False, часть сообщений могла появиться на экране с задержкой, особенно при перенаправлении вывода в файл.

Явный вызов flush через sys.stdout

Иногда проще вызывать flush напрямую:

import sys
import time

for i in range(3):
    print("Значение", i, end=" ")
    sys.stdout.flush()  # Явно сбрасываем буфер
    time.sleep(1)

Такой подход полезен, если вы используете print без flush, но хотите управлять сбросом буфера сами.

Как print преобразует объекты в строки

Использование str и repr

Когда вы передаете объект в print, Python делает следующее:

  • вызывает для него функцию str(obj);
  • результатом становится "человеко-читаемое" представление объекта.

Пример:

class User:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        # Этот метод определяет "красивое" строковое представление
        return f"Пользователь {self.name}"

    def __repr__(self):
        # Это представление для отладки
        return f"User(name={self.name!r})"


u = User("Анна")

print(u)
# Вывод:
# Пользователь Анна

Если метод str не определен, Python использует repr.

Использование repr для отладки

Иногда вам нужно увидеть "сырой" вид объекта. Тогда используют функцию repr или форматы с !r:

value = "строка с пробелами "

print(value)
# Вывод:
# строка с пробелами 

print(repr(value))
# Вывод:
# 'строка с пробелами '

print(f"{value!r}")
# Вывод:
# 'строка с пробелами '

Обратите внимание, repr показывает кавычки и иногда управляющие символы явно, что удобно для отладки.

Форматирование строк при выводе

Конкатенация строк против передачи нескольких аргументов

Есть два базовых подхода:

  1. Склеивать строки с помощью оператора +.
  2. Передавать несколько аргументов в print.
name = "Игорь"
age = 30

# Вариант 1 - конкатенация
print("Имя: " + name + ", возраст: " + str(age))

# Вариант 2 - несколько аргументов
print("Имя:", name, "возраст:", age)

Передача через запятую удобнее: нет ошибок типов, не нужно явно вызывать str(age).

Но есть более гибкий и современный подход — форматирование строк.

f-строки (форматированные литералы)

В Python 3.6+ удобнее всего использовать f-строки. Давайте посмотрим, что происходит в следующем примере.

name = "Игорь"
age = 30

print(f"Имя: {name}, возраст: {age}")
# Вывод:
# Имя: Игорь, возраст: 30

Внутри фигурных скобок можно писать выражения:

x = 10
y = 3

print(f"{x} / {y} = {x / y:.2f}")
# Вывод:
# 10 / 3 = 3.33

Комментарии:

  • x / y — само выражение;
  • :.2f — формат числа с двумя знаками после запятой.

Метод format

Если вы по каким-то причинам не хотите использовать f-строки, можно работать через метод format:

template = "Имя: {}, возраст: {}"
print(template.format("Ольга", 28))
# Вывод:
# Имя: Ольга, возраст: 28

Можно указывать индексы или имена параметров:

template = "x = {x}, y = {y}, сумма = {s}"
print(template.format(x=2, y=3, s=5))
# Вывод:
# x = 2, y = 3, сумма = 5

Старый стиль форматирования через %

Старый стиль часто еще встречается в чужом коде, поэтому полезно его понимать, но для нового кода лучше использовать f-строки:

name = "Антон"
age = 22
print("Имя: %s, возраст: %d" % (name, age))
# Вывод:
# Имя: Антон, возраст: 22

Особенности вывода Юникода и русского текста

Кодировка в консоли и файлах

В Python 3 строки хранятся в Юникоде. Проблемы часто возникают не из-за print, а из-за:

  • кодировки консоли;
  • кодировки файла.

Чтобы избежать ошибок при записи в файл, указывайте encoding:

with open("text.txt", "w", encoding="utf-8") as f:
    print("Пример русского текста", file=f)
    # В файл будет записано в UTF-8

Если при выводе в консоль вы видите "кракозябры", проблема, скорее всего, в настройках терминала, а не в команде print.

Обработка ошибок кодирования

Иногда при записи в файл в "неподходящей" кодировке полезно явно указывать поведение:

with open("text_cp1251.txt", "w", encoding="cp1251", errors="replace") as f:
    # Символы, которых нет в cp1251, будут заменены
    print("Текст с эмодзи 😊", file=f)

Использование print для отладки

Быстрая проверка значений

Самый простой способ проверить, что происходит в коде, — вставить вызовы print:

def process(value):
    print("process() получил значение:", value)  # Временный отладочный вывод
    return value * 2

result = process(10)
print("Результат:", result)

Такая техника особенно полезна на первых этапах изучения языка.

Отладочный вывод с контекстом

Чтобы легче было искать вывод в логах, добавляйте контекст:

def calculate(a, b):
    print("[DEBUG] calculate() - входные данные:", a, b)
    result = a + b
    print("[DEBUG] calculate() - результат:", result)
    return result

Здесь метка [DEBUG] помогает визуально отличить отладочный вывод от обычного.

Альтернатива print — модуль logging

При более сложных проектах лучше переходить к модулю logging, но на этапе обучения print полностью покрывает базовые задачи:

  • посмотреть значения переменных;
  • понять, в каком порядке выполняется код;
  • проверить, вызывается ли функция вообще.

Типичные ошибки и подводные камни при использовании print

Ошибка с Python 2 — отсутствие скобок

В Python 2 print был оператором, а в Python 3 это функция. Если вы пишете:

print "Hello"

В Python 3 получите ошибку синтаксиса. Правильно:

print("Hello")

Если вы видите такой код в старых примерах, не забывайте добавлять скобки.

Перегрузка имени print

Иногда случайно можно "затереть" имя функции:

print = 10
print("Текст")
# Здесь будет ошибка потому что print теперь число а не функция

Если такое произошло в интерактивной консоли, достаточно перезапустить сессию. В скрипте избегайте имен переменных, совпадающих с встроенными функциями.

Неожиданное поведение из-за end или sep

Если вы забыли, что использовали нестандартный end или sep в предыдущем вызове, это может визуально "ломать" вывод:

print("Начало", end=" ")
print("Продолжение")
# Вывод:
# Начало Продолжение

Это не ошибка, но иногда сбивает с толку. Следите за тем, где вы переопределяете end и sep.

Запись в закрытый или несуществующий поток

Если вы передаете в file объект, который уже закрыт, получите ошибку:

f = open("data.txt", "w", encoding="utf-8")
f.close()

# Следующая строка вызовет ошибку ValueError
print("Текст", file=f)

Решение — использовать with и не печатать в файл за пределами блока.

Полезные шаблоны использования print

Красивый вывод списков и словарей

Для списков удобно использовать распаковку:

numbers = [1, 2, 3, 4, 5]

print("Список:", *numbers)
# Вывод:
# Список: 1 2 3 4 5

print("Через запятую:", *numbers, sep=", ")
# Вывод:
# Через запятую: 1, 2, 3, 4, 5

Для словарей можно выводить пары ключ-значение:

user = {"name": "Иван", "age": 30, "city": "Москва"}

for key, value in user.items():
    print(key, "=", value)
    # Здесь мы выводим каждую пару на новой строке

Многострочные строки и переносы

Вы можете использовать символ переноса строки \n внутри самих строк:

print("Первая строка\nВторая строка")
# Вывод:
# Первая строка
# Вторая строка

Или тройные кавычки:

text = """Строка 1
Строка 2
Строка 3"""
print(text)
# Вывод:
# Строка 1
# Строка 2
# Строка 3

"Прогресс-бар" в одной строке

Иногда нужен "динамический" вывод в одной строке, перезаписывая ее:

import time

for i in range(5):
    print(f"\rПрогресс: {i + 1}/5", end="", flush=True)
    # \r возвращает курсор в начало строки
    time.sleep(0.5)

print()  # Добавляем перенос строки после завершения

Обратите внимание:

  • \r возвращает курсор в начало строки;
  • end="" предотвращает добавление переноса строки;
  • flush=True заставляет выводиться сразу.

Заключение

Команда python print — это больше, чем просто средство вывести "Привет, мир". За простой формой скрывается набор полезных возможностей:

  • вывод произвольного количества объектов;
  • тонкая настройка разделителя (sep) и окончания строки (end);
  • перенаправление вывода в файлы и потоки (file);
  • управление буферизацией через flush;
  • разные подходы к форматированию строк (f-строки, format, %);
  • удобное использование print как инструмента отладки.

Если вы уверенно владеете всеми параметрами функции print и понимаете, как она преобразует объекты в строки, вам гораздо проще анализировать поведение программы и быстро находить ошибки. Многие разработчики годами используют лишь базовые возможности print, упуская из виду такие полезные детали, как вывод в файлы, использование sys.stderr или управление переносами строк. Освоив эти моменты, вы сделаете свой код более прозрачным и управляемым.

Частозадаваемые технические вопросы

Как сделать вывод в одну строку в цикле без пробелов между элементами

Используйте параметр end и задайте sep пустой строкой:

for i in range(5):
    print(i, sep="", end="")  # Нет пробелов и переносов строк
# Вывод:
# 01234

Комментарии:

  • sep не влияет, когда передан один объект;
  • end="" отключает перевод строки.

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

Можно временно подменить sys.stdout:

import sys

with open("out.txt", "w", encoding="utf-8") as f:
    old_stdout = sys.stdout      # Сохраняем старый поток
    sys.stdout = f               # Подменяем stdout

    print("Это уйдет в файл")
    print("И это тоже")

    sys.stdout = old_stdout      # Восстанавливаем stdout

print("А это снова в консоль")

Так вы не трогаете параметр file в каждом вызове.

Как вывести список или словарь "как есть" в виде кода Python

Используйте функцию repr:

data = [1, 2, 3, "текст"]
print(repr(data))
# Вывод:
# [1, 2, 3, 'текст']

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

Как временно отключить все вызовы print в программе

Можно заменить print на функцию-заглушку:

def noop(*args, **kwargs):
    # Функция-заглушка ничего не делает
    pass

print_backup = print  # Сохраняем оригинальный print
print = noop          # Отключаем вывод

# Здесь все print ничего не выводят

print = print_backup  # Восстанавливаем

Так удобно отключать отладочный вывод.

Как управлять шириной и выравниванием чисел при выводе

Используйте f-строки с форматами:

for i in range(1, 4):
    print(f"{i:3d} {i*i:5d}")
    # {i:3d}  - целое число шириной 3 символа
    # {i*i:5d} - целое число шириной 5 символов

Так выравнивание по правому краю сохраняется даже при разных значениях.

Стрелочка влевоPython 1 — с чего начиналась история языкаПравила именования переменных в PythonСтрелочка вправо

Постройте личный план изучения Python до уровня Middle — бесплатно!

Python — часть карты развития Backend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Все гайды по Python

Как отправлять запросы с помощью requests в PythonПочему Python выводит значение без команды printКак работает команда print в PythonВозможности Python для автоматизации задачРабота с JSON в Python на примерахPython get — методы получения данныхКак находить и исправлять ошибки в PythonРабота с данными через API и внешние сервисыСтруктура и оформление кода PythonОсновы Django с PythonПолезные приёмы в Python для повседневной работыИспользование locals в Python для отладкиИнтеграция PHP и PythonКак выполнять HTTPS-запросы в PythonКак работать с API в Python
Ввод целого числа в PythonВедение логов в PythonУдаление данных в Python с помощью removeРабота с символами программирования PythonРабота с переменной X в PythonРабота с классами в PythonКак скачать Python на компьютерПростая программа на Python для начинающихОсновы Python для тех, кто начинаетЧто нового в Python 3Поддерживается ли Python 2 и стоит ли его использоватьPython 1 — с чего начиналась история языкаКоманда python print - полное руководство по выводу данныхПравила именования переменных в PythonОсновы Python coreОписание объектов PythonКакой Python выбрать для установкиКак вывести целое число с помощью print в PythonКак установить Python на Windows macOS и LinuxКак пользоваться консолью PythonКак получить последний элемент в PythonКак найти значение в PythonКак настроить PythonКак использовать print для строк в PythonКак работает интерпретатор PythonИнструкция по работе с PythonЦелые числа в Python
Загрузка данных PythonУправление проектами на GitHub с PythonСоздание веб-приложений на Flask PythonСоздание бота на PythonСоздание интерфейсов Python QTСоздание игр с PygameСоздание GUI в PythonКак работать со словарями в PythonРабота с библиотеками через Python PackagingРабота со временем в Python при помощи модуля timePython name — особенности переменнойМатематические операции в Python с модулем mathPython listing — что это и как использоватьОбработка изображений с OpenCV PythonNumPy в Python — основы и применение в задачахМашинное обучение с PythonИспользование Anaconda с PythonБиблиотеки Python и их применение в проектах
Возврат значений из функции в PythonВложенные функции в PythonСоздание собственных декораторов в PythonРабота с функцией map в PythonЦикл while в Python и примеры использованияОбработка чисел, введённых через input в PythonОсновные операторы в Python с примерамиУсловные выражения if else в Python для начинающихКак выполняется вызов функций call в PythonПозиционные и именованные аргументы в PythonОбъявление переменных и управление областью видимости в PythonПередача аргументов по ссылке и по значению в PythonПередача аргументов через args и kwargs в PythonОсновные методы Python и примеры их использованияЛокальные и глобальные переменные в PythonЧасто используемые команды PythonКлючевые слова global и nonlocal в PythonКак создавать функции в PythonКак работает сборщик мусора в PythonКак работает область видимости переменных в PythonКак работает функция callable в PythonКак работает функция any и all в PythonКак проверить тип переменной в PythonКак передать функцию как аргумент в PythonКак использовать функцию isinstance в PythonКак использовать функцию filter в PythonКак использовать функцию filter в PythonКак использовать функцию eval безопасно в PythonКак использовать декораторы в PythonИзменяемые и неизменяемые типы данных в PythonФункции в Python и способы их вызоваФункции как объекты в PythonЧто такое замыкания в PythonЧто делает функция reduce в PythonЧто делает функция id в PythonАргументы по умолчанию в PythonАнонимные функции и lambda в PythonАлгоритмы на Python — примеры и объяснение
Запись данных в PythonУстановка pip в PythonУправление зависимостями requirement в PythonУправление библиотеками с помощью Python PackagingУдаление пробелов с помощью strip в PythonСтруктурирование кода в PythonСоздание исполняемого файла Python в exeРазбор traceback в модуле PythonРазбор site-packages в PythonРазбор Program Files в PythonРабота с Unicode кодировками в PythonРабота с системными функциями Python sysРабота с папкой AppData в PythonРабота с модулем logging в PythonРабота с каталогами в PythonРабота с CSV в PythonВиртуальная среда venv в Python — создание и настройкаКак создать простое приложение на PythonИспользование pip в Python для установки пакетовМодули в Python и организация кода в проектеИмпорт модулей в Python и правила подключенияРабота с файлами в Python пошаговоЧто делает компилятор Python и как он работаетПолучение строки из модуля PythonПодключение файлов в Python с includeПеременные среды в PythonСборка проекта с помощью packaging в PythonНастройка Python сервераИспользование Python на UbuntuИспользование консоли PythonИспользование кодировок в PythonИнициализация пакетов PythonИмпорт модулей PythonИмпорт имен в PythonСреда IDLE Python и базовые возможностиЧтение и запись TXT в PythonЧтение файлов в Python с помощью open file
Удаление элементов из списка PythonТипы данных в Python — обзор и рекомендацииОсновные операции со строками в PythonМетоды str в Python и обработка текстаСписки в Python и их ключевые методыРабота со строками и символами в PythonСоздание списков данных в PythonРабота со столбцами в PythonРабота со списком значений в PythonРабота с таблицами в Python с помощью DataFrameРабота с RFR в PythonРабота с пробелами в PythonРабота с массивами в PythonРабота с кортежами tuple PythonРабота с координатами X и Y в PythonРабота с ключами в PythonРабота с элементами данных PythonРабота с двоичными числами PythonРабота с данными в PythonРабота с данными NumPy PythonРабота с большими числами в PythonРабота с битами в PythonРабота с байтами в PythonЧто такое значение в Python и как его определитьМножества в Python и операции с нимиИспользование range в Python для цикловПроверка на четность в PythonПроверка числа в PythonПреобразование типов в PythonПреобразование списка в строку PythonПреобразование числа в строку в PythonПостроение графиков в PythonОпределение индекса элемента в PythonОкругление чисел в PythonОбъединение списков в Python с помощью zipМножества в PythonМассивы в Python и отличие от списковМассив чисел в PythonКортежи данных в PythonКак вычислить сумму чисел в PythonКак получить остаток от деления в PythonКак найти следующее число в PythonИспользование Unicode в PythonТип int в Python и его особенностиИндекс списка в PythonФункции для работы со строками в PythonЭлементы Python и способы доступа к нимДоступ к элементам массива в PythonДеление чисел в PythonРабота с данными в Python на практикеКак работать с числами в Python
Открыть базу знаний

Лучшие курсы по теме

Иконка молнииНовый
изображение курса

Основы Python

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга5.0
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий