#!/usr/bin/env python # coding: utf-8 # # Python для сбора данных # # *Алла Тамбовцева, НИУ ВШЭ* # ## Форматирование строк (продолжение) # Можно выделить три способа форматировать строки (последний – достаточно новый): # # * с помощью оператора `%` (разбирали на занятии) # * с помощью метода `.format()` # * с помощью *f-strings* # ##### Форматирование с помощью метода `.format()`. # Рассмотрим тот же пример, что и на занятии: попросим пользователя ввести с клавиатуры свое имя и возраст. # In[1]: name = input("Введите Ваше имя: ") age = int(input("Введите Ваш возраст: ")) # возраст будет целочисленным # А теперь подставим их в шаблон такого вида: # # Ваше имя: `имя`. Ваш возраст: `возраст`. # In[2]: result = "Ваше имя: {}. Ваш возраст: {}.".format(name, age) print(result) # Как можно заметить, подстановка значений с помощью `.format()` выглядит чуть проще, чем базовая с использованием оператора `%`: достаточно поставить `{}` на место пропусков, которые необходимо заполнить, и перечислить соответствующие переменные в скобках в `.format()`. Этот способ удобен тем, что не нужно задумываться о типах переменных, Python сам все распознает и поставит. # In[3]: # то же, но без создания result print("Ваше имя: {}. Ваш возраст: {}.".format(name, age)) # А теперь добавим рост. # In[4]: height = float(input("Введите Ваш рост (в метрах): ")) height # In[5]: print("Ваше имя: {}. Ваш возраст: {}. Ваш рост {} м. ".format(name, age, height)) # Интересно то, что при подстановке значений с плавающей точкой через `.format()` Python выводит число «как есть», без лишних нулей в дробной части. Но при желании число знаков после точки все же можно настроить. # In[6]: print("Ваше имя: {}. Ваш возраст: {}. Ваш рост {:.1f} м. ".format(name, age, height)) # один знак {:.1f} # Удобство такого способа форматирования ещё в том, что соблюдать порядок аргументов в `format()` (переменных для подстановки в круглых скобках) совсем необязательно. Можно просто указать их названия внутри фигурных скобок на месте пропусков, и тогда перечислять переменные как угодно, но немного в ином виде: # In[7]: # в строке: name age height # в format(): age name height print("Ваше имя: {name}. Ваш возраст: {age}. Ваш рост {height} м. ".format(age = age, name = name, height = height)) # При таком формате подстановки мы приравниваем метки в левой части (в `{}`) к значениям переменных в правой части (в `format`). Отсюда эти равенства `age = age`, `name = name` и `height = height`. # # Рассмотрим еще один пример. # In[8]: height_cm = 168 # рост в см print("Ваше имя: {n}. Ваш рост {h} см.".format(n = name, h = height_cm)) # Этот пример показывает, что метки в фигурных скобках необязательно должны совпадать с названиями переменных (пары `n = name`, `h = height_cm`). Об этих парах можно думать, используя такую аналогию: метки в фигурных скобках – это ярлыки, а сами переменные – это папки. Названия ярлыков не всегда совпадают с названиями папок: мы можем назвать ярлык *В поисках себя*, а ссылаться он будет на папку *Курсовая*. Однако, несмотря на разные названия, кликнув по ярлыку, мы придем в нужную папку, потому что при создании ярлыка было создано соответствие *В поисках себя* = *Курсовая*. Что и происходит в нашем случае с метками и переменными. # Еще одна интересная особенность форматирования строк таким способом – это возможность делать отступы и выравнивать текст. Для примера будем выводить на экран только имя. # In[9]: print('Ваше имя: {}'.format(name)) # просто выводим на экран # С помощью специального символа `>` мы выравниваем текст по правому краю. Достаточно указать, сколько символов в итоге должно быть выведено на экран (например, 20): # In[10]: print('Ваше имя: {:>20}'.format(name)) # 20 символов, из них четыре заняты именем # In[11]: print('Ваше имя: ::::::::::::::::::::') # для сравнения 20 двоеточий (пробелов) print('Ваше имя: {:>20}'.format(name)) # А с помощью символа `^` можно выравнивать текст по центру: # In[12]: print('Ваше имя: {:^20}'.format(name)) # выравнивание по центру # С методом `.format()` связано много интересных вещей. Почитать и попрактиоваться можно, например, [здесь](https://pyformat.info/) и [здесь](https://pythonworld.ru/osnovy/formatirovanie-strok-metod-format.html). # ##### Форматирование строк с помощью f-strings # Строки *f-strings* (*formatted string literals*) – довольно новое изобретение, появились в Python 3.6. С их помощью подставлять значения в текстовый шаблон можно ещё более лаконичным образом: вписывать название переменной в фигурные скобки, не забыв поставить `f` прямо перед кавычками, открывающими строку. # In[59]: name = "Алла" print(f"Ваше имя: {name}.") # просто подставляем название переменной в f # Более подробно про *f-strings* можно почитать [в официальной документации](https://docs.python.org/3/reference/lexical_analysis.html#f-strings). # **Внимание:** этот способ доступен только в Python 3.6. Если у вас стоит более раняя версия, и Вы поняли, что жить не можете без *f-strings*, можно воспользоваться хитростью: поставить библиотеку [future-strings](https://github.com/asottile/future-fstrings). Единственное, этот обходной путь не работает в Jupyter Notebook, только в консоли. Но тут поможет магия:) В Jupyter Notebook есть magic-команды. Одна из таких команд ‒`%%bash` ‒ позволяет запускать ячейку Jupyter Notebook в режиме командной строки (как будто мы работаем не в Jupyter, а в командной строке). Далее по шагам: # # 1. Создать файл fs.py (любой файл с расширением `.py`). # 2. Вписать в него строку с -*- coding и код, который нужно прогнать: # # ``` # # -*- coding: future_fstrings -*- # name = "Алла" # print(f"Ваше имя: {name}.")``` # # 3. Запустить следующую ячейку. # In[13]: get_ipython().run_cell_magic('bash', '', '\npython3 fs.py\n')