Функция Print() в Python

На примерах узнайте, какие возможности предлагает функция print в Python.

Многие из вас при чтении этого руководства наверняка подумают, что в этой простой функции нет ничего нераскрытого, потому что именно с print многие начинают свое знакомство с Python, выводя на экран заветную фразу Hello, World!. Это естественно не только для Python, но и для любого языка, что функция print является базовой и одним из первых шагов при изучении как программирования в целом, так и конкретного синтаксиса. Однако со временем многие переходят к более продвинутым темам, забывая о возможностях простых на первый взгляд функций.

Это руководство целиком посвящено функции print в Python — из него вы узнаете о том, насколько она недооценена.

Начнем с вывода фразы Hello, World!.

print("Hello, World!")
Hello, World!

Если в Python 2 скобки можно не использовать, то в Python3 они обязательны. Если их не указать, то будет вызвана синтаксическая ошибка.

print("Hello, World!")
  File "<ipython-input-6-a1fcabcd869c>", line 1
    print "Hello, World!"
                        ^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("Hello, World!")?

Из текста выше можно сделать вывод, что в Python 3 print() — это не инструкция, а функция.

Чтобы убедиться, проверим type/class функции print().

type(print)

builtin_function_or_method

Возвращается builtin_function_or_method. Это значит, что это ранее определенная или встроенная функция Python.

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

print("Hello, World!");print("Hello, World!")
Hello, World!
Hello, World!
print("Hello, World!")
print()
print("Hello, World!")
Hello, World!

Hello, World!

Рассмотрим синтаксис функции print().

print(value, ..., sep='', end='\n', file=sys.stdout, flush=False)

Как вы знаете, функция print выводит значения в поток данных или в sys.stdout по умолчанию. sys.stdout или стандартный вывод системы означают, что функция print выведет значение на экран. Его можно поменять на stdin или stderr.

Необязательные аргументы:

  • sep — это может быть строка, которую необходимо вставлять между значениями, по умолчанию — пробел.

    Вставим список слов в print и разделим их с помощью символа новой строки. Еще раз: по умолчанию разделитель добавляет пробел между каждым словом.

    print('туториал', 'по', 'функции', 'print()')
    
    туториал по функции print()
    
    # \n перенесет каждое слово на новую строку
    print('туториал', 'по', 'функции', 'print()', sep='\n')  
    
    туториал 
    по 
    функции 
    print()
    

    Также можно разделить слова запятыми или добавить два символа новой строки (\n), что приведет к появлению пустой строки между каждой строкой с текстом или, например, знак плюс (+).

    print('туториал', 'по', 'функции', 'print()', sep=',')
    
    туториал,по,функции,print()
    
    print('туториал', 'по', 'функции', 'print()', sep='\n\n')
    
    туториал 
    
    по 
    
    функции 
    
    print()
    
    print('туториал', 'по', 'функции', 'print()', sep=',+')
    
    туториал,+по,+функции,+print()
    

    Прежде чем переходить к следующему аргументу, end, стоит напомнить, что в функцию можно передать и переменную. Например, определим список целых чисел и вставим его в функцию pass. Это список и будет выведен.

    int_list = [1,2,3,4,5,6]
    print(int_list)
    
    [1, 2, 3, 4, 5, 6]
    
  • end — это строка, которая добавляется после последнего значения. По умолчанию — это перенос на новую строку (\n). С помощью аргумента end программист может самостоятельно определить окончание выражения print.

    Предположим, есть две строки, а задача состоит в том, чтобы объединить их, оставив пробел. Для этого нужно в первой функции print указать первую строку, str1 и аргумент end с кавычками. В таком случае на экран выведутся две строки с пробелом между ними.

    str1 = 'туториал по'
    str2 = 'функции print()'
    
    print(str1)
    print(str2)
    
    туториал по
    функции print()
    
    print(str1, end=' ')
    print(str2)
    
    туториал по функции print()
    

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

    def value(items):
        for item in items:
            print(item, end=' ')
    
    
    value([1,2,3,4])
    
    1 2 3 4
    
  • file — файлоподобный объект (поток). По умолчанию — это sys.stdout. Здесь можно указать файл, в который нужно записать или добавить данные из функции print.

    Таким образом вывод функции можно сохранять в файлы форматов .csv или .txt. Рассмотрим это на примере с перебором всех элементов списка. Он сохраняется в текстовом файле. В первую очередь файл нужно открыть в режиме append. Далее определяется функция, чей вывод будет добавляться внутрь текстового файла.

    file = open('print.txt','a+')
    
    
    def value(items):
        for item in items:
            print(item, file=file)
        file.close()  # закройте файл после работы с ним.
    
    value([1,2,3,4,5,6,7,8,9,10])
    

    Когда исполнение будет завершено, появится файл print.txt в текущей папке.

    Теперь очевидно, что вывод можно сохранять в файлы, а не только выводить на экран.

  • flush — определяет, нужно ли принудительно очищать поток. По умолчанию значение равно False.

    Как правило, вывод в файл или консоль буферизируется как минимум до тех пор, пока не будет напечатан символ новой строки. Буфер значит, что вывод хранится в определенном регистре до тех пор, пока файл не будет готов к сохранению значения или не окажется закрыт. Задача flush — убедиться в том что, буферизированный вывод благополучно добрался до точки назначения.

    import time
    
    print('Пожалуйста, введите ваш электронный адрес : ', end=' ')
    # print('Пожалуйста, введите ваш электронный адрес : ', end=' ', flush=True)  
    # запустите код выше, чтобы увидеть разницу.
    time.sleep(5)
    
    Пожалуйста, введите ваш электронный адрес :  
    

    Если запустить написанный выше код, вы заметите, что строка с запросом на ввод не появится до тех пор, пока таймер не закончится, а программа не закроется. Но если добавить аргумент flush=True, то строка отобразится сразу, но нужно будет подождать 5 секунд, чтобы программа закрылась.

    Каким-то образом Jupyter Notebook или Jupyter Lab иначе разбираются с этой особенностью и все равно показывают текст перед 5-секундным таймером, поэтому если хочется проверить эту особенность print, то функцию необходимо запускать в командной строке, а не в Jupyter.

А теперь посмотрим, как можно использовать функцию print для получения ввода от пользователя в Jupyter Notebook. Для этого используется встроенная функция input().

tutorial_topic = input()
print("Тема сегодняшнего урока: ", end='')
print(tutorial_topic)
функция print()


Тема сегодняшнего урока: функция print()

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

Рассмотрим другие интересные способы вывода значений переменных в функции print.

  • Для отображения значения переменной вместе с определенной строкой, нужно лишь добавить запятые между ними. В этом случае положение строки и переменной не имеет значения.
    a = 2
    b = "PythonRU"
    print(a,"— целое число, а",b,"— строка.")
    
    2 — целое число, а PythonRU — строка.
    
  • Можно использовать метод format, передавая ему любые значения переменных для вывода. При их передаче нужно указывать номера индексов (в том порядке, в котором они размещаются в аргументе) в строке. В таком случае функция print будет выступать шаблоном.

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

    Разберем это на примере:

    a = 2
    b = "PythonRU"
    print("{0} — целое число, а {1} — строка.".format(a,b))
    
    2 — целое число, а PythonRU — строка.
    

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

    a = 2
    b = "PythonRU"
    print("{1} — целое число, а {1} — строка.".format(a,b))
    
    PythonRU — целое число, а PythonRU — строка.
    
  • Вместо аргумента format можно использовать знак процента (%) для вывода значений переменных.

    Этот способ тоже работает по принципу заполнителей. Но здесь не нужно указывать номера индексов, а только обозначить тип данных, которые получит функция.

    • %d — это заполнитель для числовых или десятичных значений.
    • %s — заполнитель для строк.
    a = 2
    b = "PythonRU"
    print("%d — целое число, а %s — строка."%(a,b))
    
    2 — целое число, а PythonRU — строка.
    

    Посмотрим, что произойдет, если указать %s для переменной a, которая является целым числом.

    print("%s — целое число, а %s — строка."%(a,b))
    
    2 — целое число, а PythonRU — строка.
    

    Как видно, все работает. Причина в том, что функция print неявно выполняет typecasting и конвертирует целое число в строку. Но в обратном порядке это работать не будет. Функция не сможет конвертировать строку в целое число, а вместо этого выведется TypeError.


    print("%d — целое число, а %d — строка."%(a,b))
    
    
    ---------------------------------------------------------------------------
    
    TypeError                                 Traceback (most recent call last)
    
    <ipython-input-121-68c55041ecfe> in <module>
    ----> 1 print("%d — целое число, а %d — строка."%(a,b))
    
    
    TypeError: %d format: a number is required, not str
    
    

Вывод

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