Базовый ввод, вывод и форматирование строки в Python
Чтобы быть полезной, программе обычно необходимо общаться с внешним миром, получая входные данные от пользователя и отображая данные результатов обратно пользователю. Этот урок познакомит вас с вводом и выводом Python.
Ввод может осуществляться непосредственно от пользователя через клавиатуру или из какого-либо внешнего источника, такого как файл или база данных. Вывод может быть отображен непосредственно на консоль или IDE, на экран через графический интерфейс пользователя (GUI) или снова на внешний источник.
В previous tutorial в этой вводной серии вы:
-
Увидел сравнение некоторых различных парадигм, используемых языками программирования для реализации определенной итерации
-
Узнали об итераторах и итераторах, двух концепциях, которые составляют основу определенной итерации в Python
-
Связали все вместе, чтобы узнать о циклах Python для for
*К концу этого урока вы узнаете, как:*
*Возьмите пользовательский ввод с клавиатуры с помощью встроенной функции* `+ input () +` * *Вывод вывода на консоль с помощью встроенной функции* `+ print () +` * *Форматирование строковых данных с помощью оператора* string modulo *
Без лишних слов, давайте окунемся!
*Бесплатный бонус:* ссылка: [Нажмите здесь, чтобы получить шпаргалку Python] и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.
Чтение ввода с клавиатуры
Программы часто должны получать данные от пользователя, обычно путем ввода с клавиатуры. Самый простой способ сделать это в Python - с помощью + input () +
.
+ Входной сигнал ([<запрос>]) +
_ Читает строку ввода с клавиатуры. _
+ input () +
приостанавливает выполнение программы, чтобы позволить пользователю вводить строку ввода с клавиатуры. Когда пользователь нажимает клавишу [.keys] # Enter #, все набранные символы читаются и возвращаются в виде строки:
>>>
>>> s = input()
foo bar baz
>>> s
'foo bar baz'
Обратите внимание, что новая строка, сгенерированная, когда пользователь нажимает клавишу [.keys] # Enter #, не включена в возвращаемую строку.
Если вы включите необязательный аргумент + <prompt> +
, + input () +
отобразит его как приглашение для пользователя, прежде чем приостановить чтение ввода:
>>>
>>> name = input('What is your name? ')
What is your name? Winston Smith
>>> name
'Winston Smith'
+ input () +
всегда возвращает строку. Если вам нужен числовой тип, вам нужно преобразовать строку в соответствующий тип с помощью встроенных функций + int () +
, + float () +
или + complex () +
):
>>>
1 >>> n = input('Enter a number: ')
2 Enter a number: 50
3 >>> print(n + 100)
4 Traceback (most recent call last):
5 File "<stdin>", line 1, in <module>
6 TypeError: must be str, not int
7
8 >>> n = int(input('Enter a number: '))
9 Enter a number: 50
10 >>> print(n + 100)
11 150
В приведенном выше примере выражение + n + 100 +
в строке 3 недопустимо, поскольку + n +
является строкой, а + 100 +
является целым числом. Строка 8 преобразует + n +
в целое число, поэтому оператор + print () +
в строке 10 завершается успешно.
*Примечание к версии Python:* Если вы обнаружите, что работаете с кодом Python 2.x, вы можете столкнуться с небольшой разницей в функциях ввода между версиями Python 2 и 3.
+ raw_input () +
в Python 2 считывает ввод с клавиатуры и возвращает его. + raw_input () +
в Python 2 ведет себя так же, как + input () +
в Python 3, как описано выше.
Но в Python 2 также есть функция с именем + input () +
. В Python 2 + input () +
читает ввод с клавиатуры, parses и оценивает его как выражение Python, а затем возвращает полученное значение.
Python 3 не предоставляет единственной функции, которая делает именно то, что Python 2 + input () +
делает. Эффект можно имитировать в Python 3 с помощью выражения + eval (input ()) +
. Однако это считается угрозой безопасности, поскольку позволяет пользователю запускать произвольный, потенциально вредоносный код.
См. Https://docs.python.org/3/library/functions.html#eval[Python документацию] для получения дополнительной информации о + eval () +
и https://en.wikipedia.org/wiki./Eval [Wikipedia + eval +
page] для обсуждения потенциальных угроз безопасности.
Запись вывода на консоль
В дополнение к получению данных от пользователя, программа также обычно должна представлять данные обратно пользователю. Вы можете отобразить данные программы на консоли в Python с помощью + print () +
.
Неформатированный консольный вывод
Чтобы отобразить объекты на консоли, передайте их как разделенный запятыми список аргументов в + print () +
.
+ print (<obj>, …, <obj>) +
_
Отображает строковое представление каждого + <obj> +
на консоли.
_
По умолчанию + print () +
отделяет каждый объект одним пробелом и добавляет новую строку в конец вывода:
>>>
>>> fname = 'Winston'
>>> lname = 'Smith'
>>> print('Name:', fname, lname)
Name: Winston Smith
Любой тип объекта может быть указан в качестве аргумента + print () +
. Если объект не является строкой, то + print () +
преобразует его в соответствующее строковое представление, отображающее его:
>>>
>>> a = [1, 2, 3]
>>> type(a)
<class 'list'>
>>> b = -12
>>> type(b)
<class 'int'>
>>> d = {'foo': 1, 'bar': 2}
>>> type(d)
<class 'dict'>
>>> type(len)
<class 'builtin_function_or_method'>
>>> print(a, b, d, len)
[1, 2, 3] -12 {'foo': 1, 'bar': 2} <built-in function len>
Как видите, даже сложные типы, такие как списки, словари и функции, могут отображаться на консоли с помощью + print () +
.
Ключевое слово Аргументы в + print () +
+ print () +
принимает несколько дополнительных аргументов, которые обеспечивают скромный контроль над форматом вывода. Каждый из них представляет собой специальный тип аргумента, называемый ключевое слово аргумента . Эта вводная серия руководств будет включать в себя учебник по функциям и передаче параметров, чтобы вы могли больше узнать об аргументах ключевых слов.
А сейчас вот что вам нужно знать:
-
Аргументы ключевых слов имеют вид
+ <ключевое слово> = <значение> +
. *Любые ключевые аргументы, передаваемые в+ print () +
, должны заканчиваться после списка отображаемых объектов.
В следующих разделах вы увидите, как эти ключевые аргументы влияют на вывод консоли, создаваемый + print () +
.
+ Sep = +
Аргумент ключевого слова
Добавление ключевого аргумента + sep = <str> +
приводит к разделению объектов строкой + <str> +
вместо единственного пробела по умолчанию:
>>>
>>> print('foo', 42, 'bar')
foo 42 bar
>>> print('foo', 42, 'bar', sep='/')
foo/42/bar
>>> print('foo', 42, 'bar', sep='...')
foo...42...bar
>>> d = {'foo': 1, 'bar': 2, 'baz': 3}
>>> for k, v in d.items():
... print(k, v, sep=' -> ')
...
foo -> 1
bar -> 2
baz -> 3
Чтобы объединить объекты без пробелов между ними, укажите + sep = '' +
:
>>>
>>> print('foo', 42, 'bar', sep='')
foo42bar
Вы можете указать любую произвольную строку в качестве разделителя с помощью ключевого слова + sep = +
.
+ End = +
Аргумент ключевого слова
Ключевое слово аргумент + end = <str> +
заставляет вывод завершаться символом + <str> +
вместо новой строки по умолчанию:
>>>
>>> if True:
... print('foo', end='/')
... print(42, end='/')
... print('bar')
...
foo/42/bar
Например, если вы отображаете значения в цикле, вы можете использовать + end = +
, чтобы значения отображались в одной строке, а не в отдельных строках:
>>>
>>> for n in range(10):
... print(n)
...
0
1
2
3
4
5
6
7
8
9
>>> for n in range(10):
... print(n, end=(' ' if n < 9 else '\n'))
...
0 1 2 3 4 5 6 7 8 9
Любая строка может быть указана как выходной терминатор с ключевым словом + end = +
.
Аргументы ключевого слова выходного потока
+ print () +
принимает два дополнительных ключевых аргумента, оба из которых влияют на обработку выходного потока:
+ flush = True +
: *Обычно + print () +
буферизует свой вывод и только периодически записывает в выходной поток. + flush = True +
указывает, что выходной поток принудительно сбрасывается при каждом + print () +
.Эти два ключевых аргумента представлены здесь для полноты картины. Возможно, вам не нужно слишком беспокоиться о выходных потоках на этом этапе. Они обсуждаются позже в этой серии в руководстве по File I/O.
Форматированный строковый вывод
+ print () +
поддерживает форматирование вывода консоли, которое в лучшем случае является элементарным. Вы можете выбрать способ разделения печатных объектов и указать, что идет в конце печатной строки. Это об этом.
Во многих случаях вам потребуется более точный контроль над отображением данных, предназначенных для отображения. Python предоставляет несколько способов форматирования выходных строковых данных. В этом разделе вы узнаете об одном из старых: оператор* string modulo *.
В последних версиях Python появились более новые способы форматирования строковых данных, которые, возможно, превосходят оператор строкового модуля: string + .format () +
method и f-strings . Вы узнаете об этом в следующем уроке этой серии. Вы также можете проверить эти статьи:
Хотя доступны и другие параметры форматирования, оператор строкового модуля по-прежнему широко используется. Если вы читаете существующий код Python, вы, вероятно, столкнетесь со строковым оператором по модулю, поэтому будет полезно ознакомиться с ним.
*Примечание:* Если вы знакомы с семейством функций https://en.wikipedia.org/wiki/Printf_format_string [`+ printf () +`] из C, Perl или Java, то вы увидите, что они не существуют в Python. Тем не менее, между `+ printf () +` и строковым оператором по модулю есть некоторое сходство, поэтому, если вы знакомы с `+ printf () +`, многие из следующих элементов будут вам знакомы.
С другой стороны, если вы не знакомы с + printf () +
, не беспокойтесь! Следующее должно иметь смысл.
Строковый оператор по модулю
Оператор modulo (+% +
) обычно используется с числами, и в этом случае он вычисляет остаток от деления:
>>>
>>> 11 % 3
2
Для строковых операндов оператор по модулю выполняет совершенно другую функцию: форматирование строки. (Эти две операции не очень похожи друг на друга. Они имеют одинаковое имя, потому что они представлены одним и тем же символом: +% +
.)
Вот как выглядит синтаксис строкового оператора по модулю:
<format_string> % <values>
В левой части оператора +% +
, + <format_string> +
- строка, содержащая один или несколько спецификаторов преобразования. + <Values> +
справа вставляется в + <format_string> +
вместо спецификаторов преобразования. Результирующая форматированная строка является значением выражения.
Давайте начнем с примера. Вот оператор + print () +
, который отображает отформатированную строку, используя оператор строки по модулю:
>>>
>>> print('%d %s cost $%.2f' % (6, 'bananas', 1.74))
6 bananas cost $1.74
Помимо представления самой строковой операции по модулю, символ + '%' +
также обозначает спецификаторы преобразования в строке формата - в этом случае + '% d' +
, + '% s' +
и + '%. 2f' +
.
В выходных данных каждый элемент из набора значений преобразуется в строковое значение и вставляется в строку формата вместо соответствующего спецификатора преобразования:
-
Первым элементом в кортеже является
+ 6 +
, числовое значение, которое заменяет+ '% d' +
в строке формата. -
Следующим элементом является строковое значение
+ 'bananas' +
, которое заменяет+ '% s' +
. -
Последний элемент - это значение с плавающей точкой
+ 1.74 +
, которое заменяет+ '%. 2f' +
.
В результате получается строка «+6 бананов стоимостью $ 1,74 +», как показано на следующей диаграмме:
Если нужно вставить несколько значений, они должны быть заключены в кортеж, как показано выше. Если есть только одно значение, оно может появиться само по себе:
>>>
>>> print('Hello, my name is %s.' % 'Graham')
Hello, my name is Graham.
Также обратите внимание, что строковая операция по модулю не только для печати. Вы также можете отформатировать значения и присвоить их другой строковой переменной:
>>>
>>> s = 'Hello, my name is %s.' % 'Graham'
>>> s
'Hello, my name is Graham.'
(Опять же, если вы знакомы с функциями, связанными с + printf () +
, то это напоминает + sprintf () +
. Если нет, то не переживайте.)
Спецификаторы конверсии
Спецификаторы преобразования появляются в + <format_string> +
и определяют, как значения форматируются, когда они вставляются.
Спецификатор преобразования начинается с символа +% +
и состоит из следующих компонентов:
_
+% [<Флаги>] [<ширина>] [. <Точность>] <тип> +
_
+% +
и + <тип> +
обязательны. Остальные компоненты, показанные в квадратных скобках, не являются обязательными.
В следующей таблице приведены действия каждого компонента спецификатора преобразования:
Component | Meaning |
---|---|
|
Introduces the conversion specifier |
|
Indicates one or more flags that exert finer control over formatting |
|
Specifies the minimum width of the formatted result |
|
Determines the length and precision of floating point or string output |
|
Indicates the type of conversion to be performed |
Читайте дальше, чтобы узнать, как это работает.
Тип конверсии
Тип преобразования + <тип> +
является последним компонентом спецификатора преобразования:
_
+% [<Флаги>] [<ширина>] [. <Точность>] +
* + <тип> +