A quick guide to format string in python

Форматирование чисел

Вы можете форматировать числа, используя описатель формата, указанный ниже:

Типы форматирования чисел
Тип Пример
d Десятичное целое число
c Соответствующий символ Юникода
b Двоичный формат
o Восьмеричный формат
x Шестнадцатеричный формат (нижний регистр)
X Шестнадцатеричный формат (верхний регистр)
n То же, что и d. За исключением того, что для разделителя чисел используется текущий языковой стандарт.
e Экспоненциальная запись. (строчная е)
E Экспоненциальная запись (прописная E)
f Отображает номер с фиксированной точкой (по умолчанию: 6)
F То же, что и f. За исключением того, что отображает inf как INF и nan как NAN.
g Общий формат. Округляет число до p значащих цифр. (Точность по умолчанию: 6)
G То же, что и g. За исключением переключения на «E», если число большое.
% Процент. Умножает на 100 и ставит% в конце.

“Старая-школа” форматирования строк в Python

До Python 3.6 у нас было два основных способа встраивания выражений Python в строковые литералы для форматирования: % — форматирование и str.format(). Рассмотрим, как их использовать и каковы их ограничения.

Вариант #1: % — форматирование

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

Как используется % — форматирование

Строковые объекты имеют встроенную операцию с использованием оператора %, который можно использовать для форматирования строк. Вот как это выглядит на практике:

>>> name = "Eric"
>>> "Hello, %s." % name
'Hello, Eric.'

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

>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'

Недостатки % — форматирования

Примеры кода, которые вы только что видели выше, достаточно читабельны. Однако, как только вы начнете использовать несколько параметров и более длинные строки, ваш код быстро станет менее читаемым. Все начинает выглядеть немного грязно:

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "Hello, %s %s. You are %s. You are a %s. You were a member of %s." % (first_name, last_name, age, profession, affiliation)
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'

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

Вариант #2: str.format()

Этот новый способ вывода строк был представлен в Python 2.6. Вы можете обратиться к для получения дополнительной информации.

Как используется str.format()

str.format() — это улучшение % — форматирования. Он использует обычный синтаксис вызова функции и метода __format__() для объекта, преобразуемого в строку.

С помощью str.format() поля вывода переменных отмечены фигурными скобками:

>>> "Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 74.'

Вы можете ссылаться на переменные в любом порядке, ссылаясь по их индексам:

>>> "Hello, {1}. You are {0}.".format(age, name)
'Hello, Eric. You are 74.'

Но если вы вставите имена переменных, вы получите дополнительную возможность передавать объекты, а затем ссылаться на параметры и методы между фигурными скобками:

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(name=person, age=person)
'Hello, Eric. You are 74.'

Вы также можете использовать символ **, чтобы использовать этот трек со словарями:

>>> person = {'name': 'Eric', 'age': 74}
>>> "Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 74.'

str.format() определенно является улучшением по сравнению с % — форматированием, но и у него есть свои недостатки.

В чем недостатки str.format()

Код, использующий str.format(), гораздо легче читается, чем код, использующий % -форматирование, но str.format() все еще может быть достаточно многословным, когда вы имеете дело с несколькими параметрами и более длинными строками. Посмотрите на это:

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> print(("Hello, {first_name} {last_name}. You are {age}. " + 
>>>        "You are a {profession}. You were a member of {affiliation}.") \
>>>        .format(first_name=first_name, last_name=last_name, age=age, \
>>>                profession=profession, affiliation=affiliation))
'Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.'

Если у вас есть переменные, которые вы хотите передать в .format() в словаре, то вы можете просто распаковать его с помощью .format (** some_dict) и ссылаться на значения по ключу в строке.

Форматирование строк

Часто возникает ситуация, когда необходимо создать строку, подставив в нее определенные значения, полученные во время выполнения программы. Подстановка данных в таком случае выполняется при помощи форматирования строк, сделать это можно несколькими способами.

Оператор %

Строки в Python обладают встроенной операцией, к которой можно получить доступ оператором %, что дает возможность очень просто делать форматирование. Самый простой пример – когда для подстановки нужен только один аргумент, значением будет он сам:

Если же для подстановки используется несколько аргументов, то значением будет кортеж со строками:

Как видно из предыдущего примера, зависимо от типа данных для подстановки и того, что требуется получить в итоге, пишется разный формат. Наиболее часто используются:

  1. ‘%d’, ‘%i’, ‘%u – десятичное число;
  2. ‘%c’ – символ, точнее строка из одного символа или число – код символа;
  3. ‘%r’ – строка (литерал Python);
  4. ‘%s’ – строка.

Такой способ форматирования строк называет «старым» стилем, который в Python 3 был заменен на более удобные способы.

str.format()

В Python 3 появился более новый метод форматирования строк, который вскоре перенесли и в Python 2.7. Такой способ избавляет программиста от специального синтаксиса %-оператора. Делается все путем вызова .format() для строковой переменной. С помощью специального символа – фигурных скобок – указывается место для подстановки значения, каждая пара скобок указывает отдельное место для подстановки, значения могут быть разного типа:

В Python 3 форматирование строк с использованием «нового стиля» является более предпочтительным по сравнению с использованием %-стиля, так как предоставляет более широкие возможности, не усложняя простые варианты использования.

f-строки (Python 3.6+)

В Python версии 3.6 появился новый метод форматирования строк – «f-строки», с его помощью можно использовать встроенные выражения внутри строк:

Такой способ форматирования очень мощный, так как дает возможность встраивать выражения:

Таким образом, форматирование с помощью f-строк напоминает использование метода format(), но более гибкое, быстрое и читабельное.

Стандартная библиотека Template Strings

Еще один способ форматирования строк, который появился еще с выходом Python версии 2.4, но так и не стал популярным – использование библиотеки Template Strings. Есть поддержка передачи значения по имени, используется $-синтаксис как в языке PHP:

Форматирование строк

Форматирование строк (также известно как замещение) – это замещение значений в базовой строке. Большую часть времени вы будете вставлять строки внутри строк, однако, вам также понадобиться вставлять целые числа и числа с запятыми в строки весьма часто. Существует два способа достичь этой цели. Начнем с старого способа, после чего перейдем к новому:

Python

# -*- coding: utf-8 -*-

my_string = «Я люблю %s» % «Python»
print(my_string) # Я люблю Python

var = «яблоки»
newString = «Я ем %s» % var
print(newString) # Я ем яблоки

another_string = «Я люблю %s и %s» % («Python», var)
print(another_string) # Я люблю Python и яблоки

1
2
3
4
5
6
7
8
9
10
11

# -*- coding: utf-8 -*-
 

my_string=»Я люблю %s»%»Python»

print(my_string)# Я люблю Python

var=»яблоки»

newString=»Я ем %s»%var

print(newString)# Я ем яблоки

another_string=»Я люблю %s и %s»%(«Python»,var)

print(another_string)# Я люблю Python и яблоки

Как вы могли догадаться, % — это очень важная часть вышеописанного кода. Этот символ указывает Python, что вы скоро вставите текст на его место. Если вы будете следовать за строкой со знаком процента и другой строкой или переменной, тогда Python попытается вставить ее в строку. Вы можете вставить несколько строк, добавив несколько знаков процента в свою строку. Это видно в последнем примере

Обратите внимание на то, что когда вы добавляете больше одной строки, вам нужно закрыть эти строки в круглые скобки. Теперь взглянем на то, что случится, если мы вставим недостаточное количество строк:

Python

another_string = «Я люблю %s и %s» % «Python»

Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: not enough arguments for format string

1
2
3
4
5

another_string=»Я люблю %s и %s»%»Python»

Traceback(most recent call last)

File»<string>»,line1,in<fragment>

TypeErrornotenough arguments forformatstring

О-па. Мы не передали необходимое количество аргументов для форматирования строки. Если вы внимательно взгляните на пример, вы увидите, что у нас есть два экземпляра %, но для того, чтобы вставить строки, вам нужно передать столько же %, сколько у нас строк. Теперь вы готовы к тому, чтобы узнать больше о вставке целых чисел, и чисел с запятыми. Давайте взглянем.

Python

my_string = «%i + %i = %i» % (1,2,3)
print(my_string) # ‘1 + 2 = 3’

float_string = «%f» % (1.23)
print(float_string) # ‘1.230000’

float_string2 = «%.2f» % (1.23)
print(float_string2) # ‘1.23’

float_string3 = «%.2f» % (1.237)
print(float_string3) # ‘1.24’

1
2
3
4
5
6
7
8
9
10
11

my_string=»%i + %i = %i»%(1,2,3)

print(my_string)# ‘1 + 2 = 3’

float_string=»%f»%(1.23)

print(float_string)# ‘1.230000’

float_string2=»%.2f»%(1.23)

print(float_string2)# ‘1.23’

float_string3=»%.2f»%(1.237)

print(float_string3)# ‘1.24’

Первый пример достаточно простой. Мы создали строку, которая принимает три аргумента, и мы передаем их. В случае, если вы еще не поняли, Python не делает никаких дополнений в первом примере. Во втором примере, мы передаем число с запятой

Обратите внимание на то, что результат включает множество дополнительных нулей (1.230000). Нам это не нужно, так что мы указываем Python ограничить выдачу до двух десятичных значений в третьем примере (“%.2f”)

Последний пример показывает, что Python округлит числа для вас, если вы передадите ему дробь, что лучше, чем два десятичных значения. Давайте взглянем на то, что произойдет, если мы передадим неправильные данные:

Python

int_float_err = «%i + %f» % («1», «2.00»)
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: %d format: a number is required, not str

1
2
3
4

int_float_err=»%i + %f»%(«1″,»2.00»)

Traceback(most recent call last)

File»<string>»,line1,in<fragment>

TypeError%dformatanumber isrequired,notstr

В данном примере мы передали две строки вместо целого числа и дроби. Это привело к ошибке TypeError, что говорит нам о том, что Python ждал от нас чисел. Это указывает на отсутствие передачи целого числа, так что мы исправим это, по крайней мере, попытаемся:

Python

int_float_err = «%i + %f» % (1, «2.00»)

Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: float argument required, not str

1
2
3
4
5

int_float_err=»%i + %f»%(1,»2.00″)

Traceback(most recent call last)

File»<string>»,line1,in<fragment>

TypeErrorfloatargument required,notstr

Мы получили ту же ошибку, но под другим предлогом, в котором написано, что мы должны передать дробь. Как мы видим, Python предоставляет нам полезную информацию о том, что же пошло не так и как это исправить. Если вы исправите вложения надлежащим образом, тогда вы сможете запустить этот пример. Давайте перейдем к новому методу форматирования строк.

Решение задач

1. Поэкспериментируйте с переводом в различные типы данных

2. Пользователь вводит свое имя и фамилию. Выведите:

Hello, имя фамилия
# На месте слов с % должны быть введенные данные

3. Посчитайте сумму трех введенных целых чисел

4. Посчитайте сумму трех введенных дробных чисел. Подумайте в какой тип данных нужно преобразовать значение, возвращенное функцией input

5. Дано число, выведите предыдущее и следущее за ним числа в таком формате:

# Число равно 10

Число предшествующее числу 10 равно 9

Число следующее за числом 10 равно 11

6. Вводятся имя и возраст. Выведите, где введенное имя = Максим, а возраст = 20

Привет, Максим! Ваш возраст равен 20!

Функция input

Функция input является функцией стандартного ввода (stdin). Ее главная задача — это передача введенных пользователем данных в функцию.

name = input()
print(‘Hello, ‘ + name)

Функция input может принимать всего лишь один аргумент — строку, которая выведется перед кареткой ввода

name = input(‘Enter your name: ‘)
print(‘Hello, ‘ + name)

Функция input возвращает строковый тип данных

Строки можно складывать друг с другом — это называется конкатенацией или объединением

number = input()
print(type(number))
#

Поэтому если мы напишем такой код, то он будет работать некорректно:

number1 = input()

number2 = input()
print(number1 + number2)
# Ввод:
# 1
# 2
# Вывод:
# 12

Поэтому необходимо преобразовать строковый тип в целочисленный (str в int)

number1 = int(input())

number2 = int(input())
print(number1 + number2)
# Ввод:
# 1
# 2
# Вывод:
# 3

Всегда проверяйте тип полученных данных, это поможет вам избежать большого количества ошибок. К слову, если вы что-то напутали с типами переменных, то Python выдаст ошибку TypeError (ошибка типа)

#2 Форматирование строк “По новому” (str.format)

Python 3 предоставил новый способ форматирования, который также был внесен в раннюю версию Python 2.7. Этот “новый стиль” форматирования строк избавляется от специального синтаксиса оператора % и делает синтаксис для форматирования строк более регулярным. Теперь форматирование обрабатывается вызовом .format() в объекте строки.

Вы можете использовать format(), чтобы выполнить простое позиционное форматирование, также, как мы делали это по старинке:

Python

print(‘Hello, {}’.format(name))
# Вывод: ‘Hello, Bob’

1
2

print(‘Hello, {}’.format(name))

# Вывод: ‘Hello, Bob’

Или, вы можете сослаться на свои подстановки переменных по имени, и использовать их в том порядке, в котором вам хочется. Это достаточно мощный способ, так как он позволяет повторно упорядочить порядок отображения без изменения переданных функции format() аргументов:

Python

print(
‘Hey {name}, there is a 0x{errno:x} error!’.format(
name=name, errno=errno
)
)

# Вывод: ‘Hey Bob, there is a 0xbadc0ffee error!’

1
2
3
4
5
6
7

print(

‘Hey {name}, there is a 0x{errno:x} error!’.format(

name=name,errno=errno

)

)
 
# Вывод: ‘Hey Bob, there is a 0xbadc0ffee error!’

Однако, официальная документация Python 3 не делает явных рекомендаций по использованию старого форматирования:

По этому я лично пытаюсь работать str.format при продвижении нового кода. Начав с Python 3.6, есть еще один способ форматирования ваших строк. Рассмотрим его в следующем разделе!

Simple and Compound Field Names

Simple field names are either names or numbers. If numbers, they
must be valid base-10 integers; if names, they must be valid
Python identifiers. A number is used to identify a positional
argument, while a name is used to identify a keyword argument.

A compound field name is a combination of multiple simple field
names in an expression:

"My name is {0.name}".format(open('out.txt', 'w'))

This example shows the use of the ‘getattr’ or ‘dot’ operator
in a field expression. The dot operator allows an attribute of
an input value to be specified as the field value.

Unlike some other programming languages, you cannot embed arbitrary
expressions in format strings. This is by design — the types of
expressions that you can use is deliberately limited. Only two operators
are supported: the ‘.’ (getattr) operator, and the ‘[]’ (getitem)
operator. The reason for allowing these operators is that they don’t
normally have side effects in non-pathological code.

An example of the ‘getitem’ syntax:

"My name is {0}".format(dict(name='Fred'))

It should be noted that the use of ‘getitem’ within a format string
is much more limited than its conventional usage. In the above example,
the string ‘name’ really is the literal string ‘name’, not a variable
named ‘name’. The rules for parsing an item key are very simple.
If it starts with a digit, then it is treated as a number, otherwise
it is used as a string.

Because keys are not quote-delimited, it is not possible to
specify arbitrary dictionary keys (e.g., the strings «10» or
«:-]») from within a format string.

Пример 9: Форматирование элементов словаря

# define Person dictionary
person = {'age': 23, 'name': 'Adam'}

# format age
print("{p}'s age is: {p}".format(p=person))

Выход

Adam's age is: 23

Подобно классу, словарь человека передается как аргумент ключевого слова p.

Внутри строки шаблона для доступа к имени и возрасту человека используются и соответственно.

Есть более простой способ форматирования словарей в Python с помощью str.format (** сопоставление).

# define Person dictionary
person = {'age': 23, 'name': 'Adam'}

# format age
print("{name}'s age is: {age}".format(**person))

** ‒ параметр формата (минимальная ширина поля).

#4 Template Strings (Standard Library)

Here’s one more tool for string formatting in Python: template strings. It’s a simpler and less powerful mechanism, but in some cases this might be exactly what you’re looking for.

Let’s take a look at a simple greeting example:

>>>

You see here that we need to import the class from Python’s built-in module. Template strings are not a core language feature but they’re supplied by the module in the standard library.

Another difference is that template strings don’t allow format specifiers. So in order to get the previous error string example to work, you’ll need to manually transform the error number into a hex-string:

>>>

That worked great.

So when should you use template strings in your Python programs? In my opinion, the best time to use template strings is when you’re handling formatted strings generated by users of your program. Due to their reduced complexity, template strings are a safer choice.

The more complex formatting mini-languages of the other string formatting techniques might introduce security vulnerabilities to your programs. For example, it’s possible for format strings to access arbitrary variables in your program.

That means, if a malicious user can supply a format string, they can potentially leak secret keys and other sensitive information! Here’s a simple proof of concept of how this attack might be used against your code:

>>>

See how a hypothetical attacker was able to extract our secret string by accessing the dictionary from a malicious format string? Scary, huh? Template strings close this attack vector. This makes them a safer choice if you’re handling format strings generated from user input:

>>>

Для аргументов ключевого слова

Мы использовали тот же пример выше, чтобы показать разницу между ключевыми и позиционными аргументами.

Здесь вместо параметров мы использовали пару «ключ-значение» для параметров. А именно name = «Adam» и blc = 230.2346.

Поскольку на эти параметры ссылаются их ключи, как {name} и {blc: 9.3f}, они известны как ключевое слово или именованные аргументы.

Внутри:

  • Заполнитель {имя} заменяется значением имени ‒ «Адам». Поскольку он не содержит никаких других кодов формата, помещается «Адам».
  • Для аргумента blc = 230.2346 заполнитель {blc: 9.3f} заменяется значением 230.2346. Но перед его заменой, как и в предыдущем примере, он выполняет над ним операцию 9.3f. Это выводит 230.235.0. Десятичная часть обрезается после трех знаков, а оставшиеся цифры округляются. Аналогично, общая ширина назначена 9, оставляя два пробела слева.

The Placeholders

The placeholders can be identified using named indexes
, numbered
indexes , or even empty placeholders
.

Example

Using different placeholder values:

txt1 = «My
name is {fname}, I’m {age}».format(fname = «John», age = 36)txt2 = «My
name is {0}, I’m {1}».format(«John»,36)txt3 = «My
name is {}, I’m {}».format(«John»,36)

Formatting Types

Inside the placeholders you can add a formatting type to format the
result:

Try it Left aligns the result (within the available space)
Try it Right aligns the result (within the available space)
Try it Center aligns the result (within the available space)
Try it Places the sign to the left most position
Try it Use a plus sign to indicate if the result is positive or negative
Try it Use a minus sign for negative values only
Try it Use a space to insert an extra space before positive numbers (and a minus sign befor negative numbers)
Try it Use a comma as a thousand separator
Try it Use a underscore as a thousand separator
Try it Binary format
Converts the value into the corresponding unicode character
Try it Decimal format
Try it Scientific format, with a lower case e
Try it Scientific format, with an upper case E
Try it Fix point number format
Try it Fix point number format, in uppercase format (show
and
as
and )
General format
General format (using a upper case E for scientific notations)
Try it Octal format
Try it Hex format, lower case
Try it Hex format, upper case
Number format
Try it Percentage format

Типы данных и преобразование типов

Перечислим основные типы данных в Python, которые понадобятся на ближайших уроках:

  • int – целочисленные значения;float – вещественные (дробные) значения;bool – логические значения — истина (True) или ложь (False);str – символьная строка или единичный символ.

Рассмотрим примеры использования основных типов в Python:Целые числа (int):

num = 13
print(num)  # 13
 
num = 
print(num)  # 0
 
num = -10
print(num)  # -10
 
num = 500_000_000  # для удобства чтения
print(num) # 500000000

Вещественные числа (float):

num = 13.4
print(num) # 13.4
 
num = 0.0
print(num) # 0.0
 
num = -15.2
print(num) # -15.2
 
num = 100_000.000_002 # для удобства чтения
print(num) # 100000.000002
 
num = 1.7e2 # 1.7 умножить на 10 в степени 2
print(num) # 170

Логический тип (bool):

print(15 == 15) # True
 
print(1 != 3) # True
 
print(3 > 4) # False
 
print(3 <= 3) # True
 
print(6 >= 6) # True
 
print(6 < 5) # False
 
x = 2
print(1 < x < 3) # True

Строки (str):

example_string = "Очень интересно"
print(example_string) # Очень интересно
 
example_string = 'Пьеса "На дне"'
print(example_string) # Пьеса "На дне"
 
example_string = "Пьеса \"На дне\"
print(example_string) # Пьеса "На дне"
 
example_string = "Как " \
                 "разбить " \
                 "объявление длинной строки"
print(example_string) # Как разбить объявление длинной строки
 
example_string = """
                 Как  
                 оставить сроку
                 в несколько строк
                 """
print(example_string) 
# Как  
# оставить сроку
# в несколько строк
# Как объединить две строки в одну
print("Можно их" + " сложить") # Можно их сложить 
 
print("Можно и так!" * 3) # Можно и так!Можно и так!Можно и так!

Рассмотрим примеры того, как используется преобразование типов в Питон:

  • преобразование в символьную строку:
1
2
3
a = 1.7
a=str(a)
print(a) # '1.7'

преобразование в целое:

1
2
3
x = 1.7
x=int(x)
print(x) # 1

преобразование в вещественное:

1
2
3
y=1
y=float(y)
print(y) # 1.0

Ввод и вывод данных

  • Вывод данных осуществляется при помощи оператора print:
1
2
3
4
5
a = 1
b = 2
print(a)
print(a + b)
print('сумма = ', a + b)

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

1
2
3
a = 1; b = 2; print(a)
print(a + b)
print('сумма = ', a + b)

Для функции print может задаваться так называемый сепаратор — разделитель между элементами вывода:

1
2
3
x=2
y=5
print ( x, "+", y, "=", x+y, sep = " " )

Результат отобразится с пробелами между элементами: 2 + 5 = 7

Для форматированного вывода используется format:

1
2
x = 11
print ( "{:4d}".format(x) )

В результате выведется число 11, а перед ним два пробела, так как указано использовать для вывода четыре знакоместа.

Или с несколькими аргументами:

1
2
x = 2
print ( "{:4d}{:4d}{:4d}".format (x, x+x, x*x) )

В итоге каждое из значений выводится из расчета 4 знакоместа.

Ввод данных осуществляется при помощи оператора :

1
2
a = input()
print(a)

В скобках функции можно указать сообщение-комментарий к вводимым данным:

a = input ("Введите количество: ")

Функция input воспринимает входные данные, как поток символов. Поэтому, чтобы принять целочисленное значение, следует воспользоваться функцией int():

a = int (input())

Задание Python 1_1:
Используя операторы input и print, выведите значения целых переменных x=5 и y=3 в следующих форматах:
3+5=?
3 | 5 | 8
Z(5)=F(3)
x=5; y=3;
Ответ: (5;3)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector