На примерах узнайте, какие возможности предлагает функция 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
еще и разберитесь с другими возможностями, которые не были рассмотрены здесь.