Python для сбора данных

Алла Тамбовцева, НИУ ВШЭ

Форматирование строк (продолжение)

Можно выделить три способа форматировать строки (последний – достаточно новый):

  • с помощью оператора % (разбирали на занятии)
  • с помощью метода .format()
  • с помощью f-strings
Форматирование с помощью метода .format().

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

In [1]:
name = input("Введите Ваше имя: ")
age = int(input("Введите Ваш возраст: ")) # возраст будет целочисленным
Введите Ваше имя: Алла
Введите Ваш возраст: 24

А теперь подставим их в шаблон такого вида:

Ваше имя: `имя`. Ваш возраст: `возраст`. 
In [2]:
result = "Ваше имя: {}. Ваш возраст: {}.".format(name, age)
print(result)
Ваше имя: Алла. Ваш возраст: 24.

Как можно заметить, подстановка значений с помощью .format() выглядит чуть проще, чем базовая с использованием оператора %: достаточно поставить {} на место пропусков, которые необходимо заполнить, и перечислить соответствующие переменные в скобках в .format(). Этот способ удобен тем, что не нужно задумываться о типах переменных, Python сам все распознает и поставит.

In [3]:
# то же, но без создания result
print("Ваше имя: {}. Ваш возраст: {}.".format(name, age))
Ваше имя: Алла. Ваш возраст: 24.

А теперь добавим рост.

In [4]:
height = float(input("Введите Ваш рост (в метрах): "))
height
Введите Ваш рост (в метрах): 1.68
Out[4]:
1.68
In [5]:
print("Ваше имя: {}. Ваш возраст: {}. Ваш рост {} м. ".format(name, age, height))
Ваше имя: Алла. Ваш возраст: 24. Ваш рост 1.68 м. 

Интересно то, что при подстановке значений с плавающей точкой через .format() Python выводит число «как есть», без лишних нулей в дробной части. Но при желании число знаков после точки все же можно настроить.

In [6]:
print("Ваше имя: {}. Ваш возраст: {}. Ваш рост {:.1f} м. ".format(name, 
                                                        age, height)) # один знак {:.1f}
Ваше имя: Алла. Ваш возраст: 24. Ваш рост 1.7 м. 

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

In [7]:
# в строке: name age height
# в format(): age name height

print("Ваше имя: {name}. Ваш возраст: {age}. Ваш рост {height} м. ".format(age = age, 
                                                                 name = name,
                                                                 height = height))
Ваше имя: Алла. Ваш возраст: 24. Ваш рост 1.68 м. 

При таком формате подстановки мы приравниваем метки в левой части (в {}) к значениям переменных в правой части (в format). Отсюда эти равенства age = age, name = name и height = height.

Рассмотрим еще один пример.

In [8]:
height_cm = 168 # рост в см
print("Ваше имя: {n}. Ваш рост {h} см.".format(n = name, h = height_cm))
Ваше имя: Алла. Ваш рост 168 см.

Этот пример показывает, что метки в фигурных скобках необязательно должны совпадать с названиями переменных (пары 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() связано много интересных вещей. Почитать и попрактиоваться можно, например, здесь и здесь.

Форматирование строк с помощью f-strings

Строки f-strings (formatted string literals) – довольно новое изобретение, появились в Python 3.6. С их помощью подставлять значения в текстовый шаблон можно ещё более лаконичным образом: вписывать название переменной в фигурные скобки, не забыв поставить f прямо перед кавычками, открывающими строку.

In [59]:
name = "Алла"
print(f"Ваше имя: {name}.") # просто подставляем название переменной в f

Более подробно про f-strings можно почитать в официальной документации.

Внимание: этот способ доступен только в Python 3.6. Если у вас стоит более раняя версия, и Вы поняли, что жить не можете без f-strings, можно воспользоваться хитростью: поставить библиотеку future-strings. Единственное, этот обходной путь не работает в 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]:
%%bash

python3 fs.py
Ваше имя: Алла.