F-строки и метод format

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

age=18; name="Федор"

и мы формируем такое сообщение:

"Меня зовут "+name+", мне "+str(age)+" и я люблю язык Python."

На выходе получим:

'Меня зовут Федор, мне 18 и я люблю язык Python.'

Но это не самый удобный и распространенный способ формирования строк в Python. Гораздо удобнее использовать специальный метод строки

str.format(*args)

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

"Меня зовут {0}, мне {1} и я люблю язык Python.".format(name, age)

Смотрите, здесь в фигурных скобках мы указываем индекс переменной, значение которой будет подставлено в это место строки. Индекс 0 – первая переменная, указанная в методе format, т.е. name, а индекс 1 – вторая переменная age. То есть, метод формат возвращает новую строку в заданном формате. И чтобы сохранить этот результат в какой-либо переменной, следует записать так:

msg = "Меня зовут {0}, мне {1} и я люблю язык Python.".format(name, age)

Теперь msg ссылается на созданную строку.

Также мы можем одну и ту же переменную указывать несколько раз, например, так:

"Меня зовут {0}, мне {1} и я люблю язык Python. {0}".format(name, age)

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

format(fio=name, old=age)

и, далее, в формате строки указываются уже эти имена:

"Меня зовут {fio}, мне {old} и я люблю язык Python. {fio}".format(fio=name, old=age)

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

"Меня зовут {name}, мне {old} и я люблю язык Python. {fio}".format(fio=name, old=age)

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

"Меня зовут {fio}, мне {old} и я люблю язык Python. {fio}".format(old=age, fio=name)

На выходе получим то же самое.

F-строки

Начиная с версии Python 3.6, появился еще один способ форматирования строк, так называемые, F-строки. И во многих случаях он еще более удобный, чем использование метода format. Здесь мы рассмотрим лишь основы использования этого подхода (F-строк), для более глубокого изучения можно обратиться к стандарту PEP498 документации Python:

https://www.python.org/dev/peps/pep-0498.

Итак, чтобы указать Python на использование механизма F-строк, перед ее литералом ставится символ ‘f’ (именно малая буква), а в фигурных скобках записывать непосредственно имена переменных:

f"Меня зовут {name}, мне {age} и я люблю язык Python."

Видите как это удобно? Или, присваивая результат переменной:

msg = f"Меня зовут {name}, мне {age} и я люблю язык Python."

Можем в дальнейшим оперировать им через переменную msg. Далее, внутри фигурных скобок F-строк в действительности можно записывать любые конструкции языка Python, например, арифметические операции и операции со строками:

f"Меня зовут {name.upper()}, мне {age*2} и я люблю язык Python."

В результате, получим:

'Меня зовут ФЕДОР, мне 36 и я люблю язык Python.'

Или даже не прописывать переменные, а использовать обычные числовые операции или вызывать отдельные функции:

f"Меня зовут {len(name)}, мне {14*2} и я люблю язык Python."

Соответственно, можно использовать и свои функции в таких строках:

def f(n):
    return n%2 == 0
 
name = "Иван"
age=18
 
msg = f"""Меня зовут {name}, мне {age} 
и проверка возраста на четность
дает значение {f(age)}"""
 
print( msg )

Помимо отдельных переменных, можно использовать любые типы данных: списки, кортежи, словари и т.д. Например, вот так:

g = {"m": "Уважаемый", "w": "Уважаемая"}
 
ps = [("Иван Федорович", 18, "m"),
("Сергей Владимирович", 32, "m"),
("Дарья Ивановна", 22, "w"),
("Ксения Петровна", 25, "w")]
 
for p in ps:
    msg = f"""{g[ p[2] ]}
{p[0]}! Поздравляем Вас
с {p[1]}-летием! Желаем
выучить язык Python"""
 
print( msg, end="\n\n" )

Здесь на выходе будем получать строки с корректным обращением к тому или иному человеку и поздравлять в соответствии с заданным шаблоном. Как видите, F-строки предоставляют большую свободу действий и при этом просты в использовании.

Задания для самоподготовки

1. Пользователь через пробел вводит ФИО. На основе этой информации требуется создать строку с сообщением:

Ваши персональные данные:
Фамилия: введенная фамилия
Имя: введенное имя
Отчество: введенное отчество

2. Имеется текстовый файл с содержимым:

Иван, ivan@gm.com, 18
Татьяна, tat@gm.com, 22
Сергей, srg@ml.ru, 33
Федор, fr@ml.ru, 41
Елена, el@gm.com, 27

Необходимо построчно считывать информацию и для каждой строки для лиц не старше 30 лет сформировать сообщение:

Уважаемый(ая) <имя>! Приглашаем Вас принять участие в курсах по изучению Python. Подробную информацию мы выслали на email: <email>.

Видео по теме