HTML Diff
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") &gt;&gt;&gt; Hello f-string<p>Теперь можно вставлять туда переменные в уже знакомых нам фигурных скобках:</p>
16 print(f"Hello f-strings") &gt;&gt;&gt; Hello f-string<p>Теперь можно вставлять туда переменные в уже знакомых нам фигурных скобках:</p>
17 name = "f-strings" # переменная print(f"Hello {name}") &gt;&gt;&gt; Hello f-strings<p>Правда ведь, стало проще и яснее? Не надо бегать взглядом в конец строки и обратно, чтобы понять, где и какая переменная выводится: всё прямо под рукой и перед глазами. И это только самое начало, едем дальше.</p>
17 name = "f-strings" # переменная print(f"Hello {name}") &gt;&gt;&gt; Hello f-strings<p>Правда ведь, стало проще и яснее? Не надо бегать взглядом в конец строки и обратно, чтобы понять, где и какая переменная выводится: всё прямо под рукой и перед глазами. И это только самое начало, едем дальше.</p>
18 <p>Фигурные скобки, несмотря на свой игривый вид, таят в себе большие возможности. Внутри них можно вызывать функции, элементы списков и словарей, а также выполнять операции - нужно просто вставить соответствующие выражения.</p>
18 <p>Фигурные скобки, несмотря на свой игривый вид, таят в себе большие возможности. Внутри них можно вызывать функции, элементы списков и словарей, а также выполнять операции - нужно просто вставить соответствующие выражения.</p>
19 num = 7 print(f'{num} в квадрате равно {num * num}') &gt;&gt;&gt; 7 в квадрате равно 49<p>Вызовем строковую функцию .upper(), превращающую все буквы строки в заглавные:</p>
19 num = 7 print(f'{num} в квадрате равно {num * num}') &gt;&gt;&gt; 7 в квадрате равно 49<p>Вызовем строковую функцию .upper(), превращающую все буквы строки в заглавные:</p>
20 name = "спарта" print(f"Это {name.upper()}!!!") &gt;&gt;&gt; Это СПАРТА!!!<p>Думаем, принцип ясен. Вот ещё пример с вызовом элементов словаря.</p>
20 name = "спарта" print(f"Это {name.upper()}!!!") &gt;&gt;&gt; Это СПАРТА!!!<p>Думаем, принцип ясен. Вот ещё пример с вызовом элементов словаря.</p>
21 dict = {'name': 'Коля', 'profession': 'программист'} print(f"{dict['name']} - это наш {dict['profession']}") &gt;&gt;&gt; Коля - это наш программист<p>Обратите внимание, что для строки и для ключей словаря вам нужно использовать разные кавычки. Например, двойные кавычки для f-строки и одинарные для ключей, как выше, или наоборот. Иначе будет синтаксическая ошибка - Python не поймёт, где строка, а где параметр.</p>
21 dict = {'name': 'Коля', 'profession': 'программист'} print(f"{dict['name']} - это наш {dict['profession']}") &gt;&gt;&gt; Коля - это наш программист<p>Обратите внимание, что для строки и для ключей словаря вам нужно использовать разные кавычки. Например, двойные кавычки для f-строки и одинарные для ключей, как выше, или наоборот. Иначе будет синтаксическая ошибка - Python не поймёт, где строка, а где параметр.</p>
22 <p>Но что, если нужно напечатать оба вида кавычек? Для начала можно попробовать старый добрый бэкслеш, или обратную косую черту. Она изолирует символ, идущий за ней, и позволяет вывести те же самые кавычки, которые оформляют основную строку.</p>
22 <p>Но что, если нужно напечатать оба вида кавычек? Для начала можно попробовать старый добрый бэкслеш, или обратную косую черту. Она изолирует символ, идущий за ней, и позволяет вывести те же самые кавычки, которые оформляют основную строку.</p>
23 print(f"Привет, \"{name}\", я 'Саша'") &gt;&gt;&gt; Привет, "Коля", я 'Саша'<p>Но внутри фигурных скобок форматированной строки бэкслеш не поддерживается. Увы. Поэтому следующий код вызовет ошибку:</p>
23 print(f"Привет, \"{name}\", я 'Саша'") &gt;&gt;&gt; Привет, "Коля", я 'Саша'<p>Но внутри фигурных скобок форматированной строки бэкслеш не поддерживается. Увы. Поэтому следующий код вызовет ошибку:</p>
24 list_a = ['a', 'b', 'c'] print(f"{'\n'.join(list_a)}") &gt;&gt;&gt; SyntaxError: f-string expression part cannot include a backslash<p>Наиболее простой и разумный путь избежать этого - вычислить выражение с бэкслешем заранее и только затем передать его в форматированную строку:</p>
24 list_a = ['a', 'b', 'c'] print(f"{'\n'.join(list_a)}") &gt;&gt;&gt; SyntaxError: f-string expression part cannot include a backslash<p>Наиболее простой и разумный путь избежать этого - вычислить выражение с бэкслешем заранее и только затем передать его в форматированную строку:</p>
25 x = "\n".join(list_a) print(f"{x}") &gt;&gt;&gt; a &gt;&gt;&gt; b &gt;&gt;&gt; c<p>Аналогично: что, если нам нужно вывести фигурные скобки в форматированной строке? Для начала стоит заметить, что фигурные скобки в f-строках не могут быть пустыми.</p>
25 x = "\n".join(list_a) print(f"{x}") &gt;&gt;&gt; a &gt;&gt;&gt; b &gt;&gt;&gt; c<p>Аналогично: что, если нам нужно вывести фигурные скобки в форматированной строке? Для начала стоит заметить, что фигурные скобки в f-строках не могут быть пустыми.</p>
26 print(f'{}') &gt;&gt;&gt; SyntaxError: f-string: empty expression not allowed<p>Однако мы можем заполнить пустые фигурные скобки другими фигурными скобками.</p>
26 print(f'{}') &gt;&gt;&gt; SyntaxError: f-string: empty expression not allowed<p>Однако мы можем заполнить пустые фигурные скобки другими фигурными скобками.</p>
27 print(f'А вот фигурные скобки: {{}}') &gt;&gt;&gt; А вот фигурные скобки: {}<p>Главная хитрость: выражения внутри "самых внутренних" фигурных скобок вычисляются только в том случае, если у нас<strong>нечётное</strong>количество пар этих скобок.</p>
27 print(f'А вот фигурные скобки: {{}}') &gt;&gt;&gt; А вот фигурные скобки: {}<p>Главная хитрость: выражения внутри "самых внутренних" фигурных скобок вычисляются только в том случае, если у нас<strong>нечётное</strong>количество пар этих скобок.</p>
28 f'{{4 + 4}}' # две пары фигурных скобок, выражение не вычисляется &gt;&gt;&gt; '{4 + 4}' f'{{{4 + 4}}}' # три пары скобок, выражение вычисляется &gt;&gt;&gt; '{8}'<p>В форматированных строках можно указать количество десятичных знаков после запятой, количество символов, выделенных для вывода значения, а также выровнять значение по левому или правому краю. Общий синтаксис выглядит так:</p>
28 f'{{4 + 4}}' # две пары фигурных скобок, выражение не вычисляется &gt;&gt;&gt; '{4 + 4}' f'{{{4 + 4}}}' # три пары скобок, выражение вычисляется &gt;&gt;&gt; '{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}') &gt;&gt;&gt; 3.<p>Если в параметре precision указать 2f, как здесь, то значение выводится с двумя знаками после запятой. Буква f в данном случае означает fractional part, то есть дробную часть числа. Если оставить просто 2, то значение целиком - и целая, и дробная часть - будет занимать два знака (точка не считается).</p>
31 pi = 3.14159265 print(f'{pi:.2f}') &gt;&gt;&gt; 3.<p>Если в параметре precision указать 2f, как здесь, то значение выводится с двумя знаками после запятой. Буква f в данном случае означает fractional part, то есть дробную часть числа. Если оставить просто 2, то значение целиком - и целая, и дробная часть - будет занимать два знака (точка не считается).</p>
32 print(f'{pi:.2}') &gt;&gt;&gt; 3.1<p>Параметр width, стоящий в фигурных скобках после двоеточия и перед точкой, определяет ширину строки, выделенной под значение, и выравнивание в ней.</p>
32 print(f'{pi:.2}') &gt;&gt;&gt; 3.1<p>Параметр width, стоящий в фигурных скобках после двоеточия и перед точкой, определяет ширину строки, выделенной под значение, и выравнивание в ней.</p>
33 print(f'{5:&lt;5}₽') # ширина 5 символов, выравниванием влево &lt; &gt;&gt;&gt; 5 ₽ print(f'{5:&gt;5}₽') # ширина 5 символов, выравниванием вправо &gt; &gt;&gt;&gt; 5₽<p>Если не указать направление выравнивания (&lt; или &gt;), то строка по умолчанию будет выравниваться по левому краю (&lt;).</p>
33 print(f'{5:&lt;5}₽') # ширина 5 символов, выравниванием влево &lt; &gt;&gt;&gt; 5 ₽ print(f'{5:&gt;5}₽') # ширина 5 символов, выравниванием вправо &gt; &gt;&gt;&gt; 5₽<p>Если не указать направление выравнивания (&lt; или &gt;), то строка по умолчанию будет выравниваться по левому краю (&lt;).</p>
34 <p>Генерация списков, словарей и множеств командами в одну строку - наиболее мощные и характерные фичи языка Python. Всё это великолепие работает и с форматированными строками. Вот список из форматированных строк, созданный на основе другого списка:</p>
34 <p>Генерация списков, словарей и множеств командами в одну строку - наиболее мощные и характерные фичи языка Python. Всё это великолепие работает и с форматированными строками. Вот список из форматированных строк, созданный на основе другого списка:</p>
35 list_b = ['a', 'b', 'c', 'd'] [f'{x + x}' for x in list_b] &gt;&gt;&gt; ['aa', 'bb', 'cc', 'dd']<p>Форматированная строка может содержать и генератор списка, с этим проблем нет, - тогда она выдаст строку, состоящую из вычисленного списка, а не из команды генератора.</p>
35 list_b = ['a', 'b', 'c', 'd'] [f'{x + x}' for x in list_b] &gt;&gt;&gt; ['aa', 'bb', 'cc', 'dd']<p>Форматированная строка может содержать и генератор списка, с этим проблем нет, - тогда она выдаст строку, состоящую из вычисленного списка, а не из команды генератора.</p>
36 f'{[x + x for x in list_b]}' &gt;&gt;&gt; "['aa', 'bb', 'cc', 'dd']"<p>Со словарями и множествами дело обстоит чуть иначе - в основном из-за наличия фигурных скобок. Поэтому для того, чтобы строка была в виде словаря, а не в виде текста генератора, надо добавлять пробелы между внутренними и внешними фигурными скобками.</p>
36 f'{[x + x for x in list_b]}' &gt;&gt;&gt; "['aa', 'bb', 'cc', 'dd']"<p>Со словарями и множествами дело обстоит чуть иначе - в основном из-за наличия фигурных скобок. Поэтому для того, чтобы строка была в виде словаря, а не в виде текста генератора, надо добавлять пробелы между внутренними и внешними фигурными скобками.</p>
37 f"{{n: n**2 for n in range(5)}}" # выведет строку генератора &gt;&gt;&gt; '{n: n**2 for n in range(5)}' f"{ {n: n**2 for n in range(5)} }" # добавили пробелы, сработало! &gt;&gt;&gt; '{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}' f"{ {n**2 for n in range(3)} }" # генератор → множество → строка &gt;&gt;&gt; '{0, 1, 4}'<p>Форматированная строка - скромный и не всегда заметный, но удобный и мощный инструмент в арсенале питониста. Используйте форматированные строки, если:</p>
37 f"{{n: n**2 for n in range(5)}}" # выведет строку генератора &gt;&gt;&gt; '{n: n**2 for n in range(5)}' f"{ {n: n**2 for n in range(5)} }" # добавили пробелы, сработало! &gt;&gt;&gt; '{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}' f"{ {n**2 for n in range(3)} }" # генератор → множество → строка &gt;&gt;&gt; '{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>