Базовый ввод, вывод и форматирование строки в 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 |
Читайте дальше, чтобы узнать, как это работает.
Тип конверсии
Тип преобразования + <тип> + является последним компонентом спецификатора преобразования:
_
+% [<Флаги>] [<ширина>] [. <Точность>] + * + <тип> +