0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#База знаний</a></p>
1
<p><a>#База знаний</a></p>
2
<ul><li>10 июн 2021</li>
2
<ul><li>10 июн 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Ваши строки никогда не были такими ясными, мощными, красивыми.</p>
4
</ul><p>Ваши строки никогда не были такими ясными, мощными, красивыми.</p>
5
<p>художественно-промышленная академия имени А. Л. Штиглица</p>
5
<p>художественно-промышленная академия имени А. Л. Штиглица</p>
6
<p>Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.</p>
6
<p>Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.</p>
7
<p>Форматирование и вывод строк - одна из наиболее типичных задач в любом языке программирования. Однако в Python до версии 3.6 у нас было, по большому счёту, всего два способа:</p>
7
<p>Форматирование и вывод строк - одна из наиболее типичных задач в любом языке программирования. Однако в Python до версии 3.6 у нас было, по большому счёту, всего два способа:</p>
8
<ul><li>оператор %;</li>
8
<ul><li>оператор %;</li>
9
<li>функция format().</li>
9
<li>функция format().</li>
10
</ul><p>Хотя они оба вполне работали в простых случаях, вывод хоть сколько-нибудь сложных строк был настоящей болью. Только взгляните на этих монстриков:</p>
10
</ul><p>Хотя они оба вполне работали в простых случаях, вывод хоть сколько-нибудь сложных строк был настоящей болью. Только взгляните на этих монстриков:</p>
11
str_1 = "Name: %s, email: %s, phone: %s" % (name, email, phone) str_2 = "Name: {}, email: {}, phone: {}".format(name, email, phone)<p>Что там говорят на вводных уроках про читаемость кода в Python?</p>
11
str_1 = "Name: %s, email: %s, phone: %s" % (name, email, phone) str_2 = "Name: {}, email: {}, phone: {}".format(name, email, phone)<p>Что там говорят на вводных уроках про читаемость кода в Python?</p>
12
<p>Первый вариант никуда не годен: мало того что надо бегать глазами туда-сюда по строке, - надо ещё помнить о ключах после символа % (для разных типов<a>они разные</a>, s - для строк) и не забыть поставить ещё один % между строкой и кортежем с переменными.</p>
12
<p>Первый вариант никуда не годен: мало того что надо бегать глазами туда-сюда по строке, - надо ещё помнить о ключах после символа % (для разных типов<a>они разные</a>, s - для строк) и не забыть поставить ещё один % между строкой и кортежем с переменными.</p>
13
<p>Второй вариант, то есть функция .format(), чуть получше, так как параметры-заменители в фигурных скобках облегчают читаемость, но всё равно не вполне подходит для строк с большим количеством переменных.</p>
13
<p>Второй вариант, то есть функция .format(), чуть получше, так как параметры-заменители в фигурных скобках облегчают читаемость, но всё равно не вполне подходит для строк с большим количеством переменных.</p>
14
<p>Так жить нельзя, решил однажды Гвидо ван Россум, и в версии 3.6 появились f-strings, они же formatted string literals, - литералы форматированных строк. Или просто форматированные строки, эф-строки, или даже, не побоимся этого слова, эф-стринги. Строки в Python’е стали "питоничнее" - компактнее, удобнее, читаемее.</p>
14
<p>Так жить нельзя, решил однажды Гвидо ван Россум, и в версии 3.6 появились f-strings, они же formatted string literals, - литералы форматированных строк. Или просто форматированные строки, эф-строки, или даже, не побоимся этого слова, эф-стринги. Строки в Python’е стали "питоничнее" - компактнее, удобнее, читаемее.</p>
15
<p>Синтаксис форматированных строк прост и прям. Вы добавляете перед строкой, прямо перед открывающими двойными или одинарными кавычками, букву f. Всё, строка теперь форматированная.</p>
15
<p>Синтаксис форматированных строк прост и прям. Вы добавляете перед строкой, прямо перед открывающими двойными или одинарными кавычками, букву f. Всё, строка теперь форматированная.</p>
16
print(f"Hello f-strings") >>> Hello f-string<p>Теперь можно вставлять туда переменные в уже знакомых нам фигурных скобках:</p>
16
print(f"Hello f-strings") >>> Hello f-string<p>Теперь можно вставлять туда переменные в уже знакомых нам фигурных скобках:</p>
17
name = "f-strings" # переменная print(f"Hello {name}") >>> Hello f-strings<p>Правда ведь, стало проще и яснее? Не надо бегать взглядом в конец строки и обратно, чтобы понять, где и какая переменная выводится: всё прямо под рукой и перед глазами. И это только самое начало, едем дальше.</p>
17
name = "f-strings" # переменная print(f"Hello {name}") >>> Hello f-strings<p>Правда ведь, стало проще и яснее? Не надо бегать взглядом в конец строки и обратно, чтобы понять, где и какая переменная выводится: всё прямо под рукой и перед глазами. И это только самое начало, едем дальше.</p>
18
<p>Фигурные скобки, несмотря на свой игривый вид, таят в себе большие возможности. Внутри них можно вызывать функции, элементы списков и словарей, а также выполнять операции - нужно просто вставить соответствующие выражения.</p>
18
<p>Фигурные скобки, несмотря на свой игривый вид, таят в себе большие возможности. Внутри них можно вызывать функции, элементы списков и словарей, а также выполнять операции - нужно просто вставить соответствующие выражения.</p>
19
num = 7 print(f'{num} в квадрате равно {num * num}') >>> 7 в квадрате равно 49<p>Вызовем строковую функцию .upper(), превращающую все буквы строки в заглавные:</p>
19
num = 7 print(f'{num} в квадрате равно {num * num}') >>> 7 в квадрате равно 49<p>Вызовем строковую функцию .upper(), превращающую все буквы строки в заглавные:</p>
20
name = "спарта" print(f"Это {name.upper()}!!!") >>> Это СПАРТА!!!<p>Думаем, принцип ясен. Вот ещё пример с вызовом элементов словаря.</p>
20
name = "спарта" print(f"Это {name.upper()}!!!") >>> Это СПАРТА!!!<p>Думаем, принцип ясен. Вот ещё пример с вызовом элементов словаря.</p>
21
dict = {'name': 'Коля', 'profession': 'программист'} print(f"{dict['name']} - это наш {dict['profession']}") >>> Коля - это наш программист<p>Обратите внимание, что для строки и для ключей словаря вам нужно использовать разные кавычки. Например, двойные кавычки для f-строки и одинарные для ключей, как выше, или наоборот. Иначе будет синтаксическая ошибка - Python не поймёт, где строка, а где параметр.</p>
21
dict = {'name': 'Коля', 'profession': 'программист'} print(f"{dict['name']} - это наш {dict['profession']}") >>> Коля - это наш программист<p>Обратите внимание, что для строки и для ключей словаря вам нужно использовать разные кавычки. Например, двойные кавычки для f-строки и одинарные для ключей, как выше, или наоборот. Иначе будет синтаксическая ошибка - Python не поймёт, где строка, а где параметр.</p>
22
<p>Но что, если нужно напечатать оба вида кавычек? Для начала можно попробовать старый добрый бэкслеш, или обратную косую черту. Она изолирует символ, идущий за ней, и позволяет вывести те же самые кавычки, которые оформляют основную строку.</p>
22
<p>Но что, если нужно напечатать оба вида кавычек? Для начала можно попробовать старый добрый бэкслеш, или обратную косую черту. Она изолирует символ, идущий за ней, и позволяет вывести те же самые кавычки, которые оформляют основную строку.</p>
23
print(f"Привет, \"{name}\", я 'Саша'") >>> Привет, "Коля", я 'Саша'<p>Но внутри фигурных скобок форматированной строки бэкслеш не поддерживается. Увы. Поэтому следующий код вызовет ошибку:</p>
23
print(f"Привет, \"{name}\", я 'Саша'") >>> Привет, "Коля", я 'Саша'<p>Но внутри фигурных скобок форматированной строки бэкслеш не поддерживается. Увы. Поэтому следующий код вызовет ошибку:</p>
24
list_a = ['a', 'b', 'c'] print(f"{'\n'.join(list_a)}") >>> SyntaxError: f-string expression part cannot include a backslash<p>Наиболее простой и разумный путь избежать этого - вычислить выражение с бэкслешем заранее и только затем передать его в форматированную строку:</p>
24
list_a = ['a', 'b', 'c'] print(f"{'\n'.join(list_a)}") >>> SyntaxError: f-string expression part cannot include a backslash<p>Наиболее простой и разумный путь избежать этого - вычислить выражение с бэкслешем заранее и только затем передать его в форматированную строку:</p>
25
x = "\n".join(list_a) print(f"{x}") >>> a >>> b >>> c<p>Аналогично: что, если нам нужно вывести фигурные скобки в форматированной строке? Для начала стоит заметить, что фигурные скобки в f-строках не могут быть пустыми.</p>
25
x = "\n".join(list_a) print(f"{x}") >>> a >>> b >>> c<p>Аналогично: что, если нам нужно вывести фигурные скобки в форматированной строке? Для начала стоит заметить, что фигурные скобки в f-строках не могут быть пустыми.</p>
26
print(f'{}') >>> SyntaxError: f-string: empty expression not allowed<p>Однако мы можем заполнить пустые фигурные скобки другими фигурными скобками.</p>
26
print(f'{}') >>> SyntaxError: f-string: empty expression not allowed<p>Однако мы можем заполнить пустые фигурные скобки другими фигурными скобками.</p>
27
print(f'А вот фигурные скобки: {{}}') >>> А вот фигурные скобки: {}<p>Главная хитрость: выражения внутри "самых внутренних" фигурных скобок вычисляются только в том случае, если у нас<strong>нечётное</strong>количество пар этих скобок.</p>
27
print(f'А вот фигурные скобки: {{}}') >>> А вот фигурные скобки: {}<p>Главная хитрость: выражения внутри "самых внутренних" фигурных скобок вычисляются только в том случае, если у нас<strong>нечётное</strong>количество пар этих скобок.</p>
28
f'{{4 + 4}}' # две пары фигурных скобок, выражение не вычисляется >>> '{4 + 4}' f'{{{4 + 4}}}' # три пары скобок, выражение вычисляется >>> '{8}'<p>В форматированных строках можно указать количество десятичных знаков после запятой, количество символов, выделенных для вывода значения, а также выровнять значение по левому или правому краю. Общий синтаксис выглядит так:</p>
28
f'{{4 + 4}}' # две пары фигурных скобок, выражение не вычисляется >>> '{4 + 4}' f'{{{4 + 4}}}' # три пары скобок, выражение вычисляется >>> '{8}'<p>В форматированных строках можно указать количество десятичных знаков после запятой, количество символов, выделенных для вывода значения, а также выровнять значение по левому или правому краю. Общий синтаксис выглядит так:</p>
29
f'{value:{width}.{precision}}'<p>Значение, двоеточие, затем ширина строки в фигурных скобках, точка, требуемая точность в фигурных скобках.</p>
29
f'{value:{width}.{precision}}'<p>Значение, двоеточие, затем ширина строки в фигурных скобках, точка, требуемая точность в фигурных скобках.</p>
30
<p>Для начала давайте посмотрим, как задать точность вывода значения.</p>
30
<p>Для начала давайте посмотрим, как задать точность вывода значения.</p>
31
pi = 3.14159265 print(f'{pi:.2f}') >>> 3.<p>Если в параметре precision указать 2f, как здесь, то значение выводится с двумя знаками после запятой. Буква f в данном случае означает fractional part, то есть дробную часть числа. Если оставить просто 2, то значение целиком - и целая, и дробная часть - будет занимать два знака (точка не считается).</p>
31
pi = 3.14159265 print(f'{pi:.2f}') >>> 3.<p>Если в параметре precision указать 2f, как здесь, то значение выводится с двумя знаками после запятой. Буква f в данном случае означает fractional part, то есть дробную часть числа. Если оставить просто 2, то значение целиком - и целая, и дробная часть - будет занимать два знака (точка не считается).</p>
32
print(f'{pi:.2}') >>> 3.1<p>Параметр width, стоящий в фигурных скобках после двоеточия и перед точкой, определяет ширину строки, выделенной под значение, и выравнивание в ней.</p>
32
print(f'{pi:.2}') >>> 3.1<p>Параметр width, стоящий в фигурных скобках после двоеточия и перед точкой, определяет ширину строки, выделенной под значение, и выравнивание в ней.</p>
33
print(f'{5:<5}₽') # ширина 5 символов, выравниванием влево < >>> 5 ₽ print(f'{5:>5}₽') # ширина 5 символов, выравниванием вправо > >>> 5₽<p>Если не указать направление выравнивания (< или >), то строка по умолчанию будет выравниваться по левому краю (<).</p>
33
print(f'{5:<5}₽') # ширина 5 символов, выравниванием влево < >>> 5 ₽ print(f'{5:>5}₽') # ширина 5 символов, выравниванием вправо > >>> 5₽<p>Если не указать направление выравнивания (< или >), то строка по умолчанию будет выравниваться по левому краю (<).</p>
34
<p>Генерация списков, словарей и множеств командами в одну строку - наиболее мощные и характерные фичи языка Python. Всё это великолепие работает и с форматированными строками. Вот список из форматированных строк, созданный на основе другого списка:</p>
34
<p>Генерация списков, словарей и множеств командами в одну строку - наиболее мощные и характерные фичи языка Python. Всё это великолепие работает и с форматированными строками. Вот список из форматированных строк, созданный на основе другого списка:</p>
35
list_b = ['a', 'b', 'c', 'd'] [f'{x + x}' for x in list_b] >>> ['aa', 'bb', 'cc', 'dd']<p>Форматированная строка может содержать и генератор списка, с этим проблем нет, - тогда она выдаст строку, состоящую из вычисленного списка, а не из команды генератора.</p>
35
list_b = ['a', 'b', 'c', 'd'] [f'{x + x}' for x in list_b] >>> ['aa', 'bb', 'cc', 'dd']<p>Форматированная строка может содержать и генератор списка, с этим проблем нет, - тогда она выдаст строку, состоящую из вычисленного списка, а не из команды генератора.</p>
36
f'{[x + x for x in list_b]}' >>> "['aa', 'bb', 'cc', 'dd']"<p>Со словарями и множествами дело обстоит чуть иначе - в основном из-за наличия фигурных скобок. Поэтому для того, чтобы строка была в виде словаря, а не в виде текста генератора, надо добавлять пробелы между внутренними и внешними фигурными скобками.</p>
36
f'{[x + x for x in list_b]}' >>> "['aa', 'bb', 'cc', 'dd']"<p>Со словарями и множествами дело обстоит чуть иначе - в основном из-за наличия фигурных скобок. Поэтому для того, чтобы строка была в виде словаря, а не в виде текста генератора, надо добавлять пробелы между внутренними и внешними фигурными скобками.</p>
37
f"{{n: n**2 for n in range(5)}}" # выведет строку генератора >>> '{n: n**2 for n in range(5)}' f"{ {n: n**2 for n in range(5)} }" # добавили пробелы, сработало! >>> '{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}' f"{ {n**2 for n in range(3)} }" # генератор → множество → строка >>> '{0, 1, 4}'<p>Форматированная строка - скромный и не всегда заметный, но удобный и мощный инструмент в арсенале питониста. Используйте форматированные строки, если:</p>
37
f"{{n: n**2 for n in range(5)}}" # выведет строку генератора >>> '{n: n**2 for n in range(5)}' f"{ {n: n**2 for n in range(5)} }" # добавили пробелы, сработало! >>> '{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}' f"{ {n**2 for n in range(3)} }" # генератор → множество → строка >>> '{0, 1, 4}'<p>Форматированная строка - скромный и не всегда заметный, но удобный и мощный инструмент в арсенале питониста. Используйте форматированные строки, если:</p>
38
<ul><li>вам важно, как выглядит вывод программы;</li>
38
<ul><li>вам важно, как выглядит вывод программы;</li>
39
<li>вы хотите повысить читаемость вашего кода.</li>
39
<li>вы хотите повысить читаемость вашего кода.</li>
40
</ul><p>А также в любой другой непонятной ситуации.</p>
40
</ul><p>А также в любой другой непонятной ситуации.</p>
41
<p>На курсе "<a>Профессия Python-разработчик</a>" вы узнаете много других, не менее мощных фишек языка и станете по-настоящему продвинутым питонистом. Приходите!</p>
41
<p>На курсе "<a>Профессия Python-разработчик</a>" вы узнаете много других, не менее мощных фишек языка и станете по-настоящему продвинутым питонистом. Приходите!</p>
42
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
42
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>