Базовый ввод, вывод и форматирование строки в Python

Базовый ввод, вывод и форматирование строки в 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

<flags>

Indicates one or more flags that exert finer control over formatting

<width>

Specifies the minimum width of the formatted result

.<precision>

Determines the length and precision of floating point or string output

<type>

Indicates the type of conversion to be performed

Читайте дальше, чтобы узнать, как это работает.

Тип конверсии

Тип преобразования + <тип> + является последним компонентом спецификатора преобразования:

_ +% [<Флаги>] [<ширина>] [. <Точность>] + * + <тип> +