Рубрики
Без рубрики

Какие F-струны?

Так что пару месяцев назад, я написал всеобъемлющий блог на Mypy. Сегодня я планирую сделать то же самое с … Теги с Python, учебник.

Так что пару месяцев назад, я написал всеобъемлющий блог на Mypy. Сегодня я планирую сделать то же самое с F-струнами, положив все, что знаю о них в единый источник знаний. Это потрясающая функция Python, и я надеюсь, что вы получите чему-то новое об этом ✨

Показатель

  • Что такое F-string?
  • Простые примеры
  • Краткая история форматирования строки
  • Почему F-струны
  • Больше примеров
    • Прокладки/усечение
    • Выравнивание
    • Округление номеров
    • Преобразование типов
    • Добавление запятых в большие номера
  • Специальный синтаксис
    • ! S,! R и! a
    • {x= } синтаксис
    • Форматирование данных
  • Вложенный форматирование
  • Пользовательское форматирование с использованием __format__
  • Ограничения
  • Вывод

Что такое F-string?

” F-strings »- это функция, добавленная в Python в версии 3.6, и это, по сути, но новый, более лаконичный способ встроить значения внутри строк.

Они называются F-струнами из-за синтаксиса: вы положите F Перед литералом строки, как так:

string = f'this is an f-string'

Простые примеры

Вот несколько основных примеров о том, как использовать F-Strings, чтобы начать:

>>> name, birth_year = 'Tushar', 2000
>>> print(f'I am {name}, and I was born in {birth_year}')
I am Tushar, and I was born in 2000
>>> import datetime; now = datetime.datetime.now()
>>> print(f'I am {now.year - birth_year} years old')
I am 21 years old
>>> age = now.year - birth_year
>>> print(f'I am {"an adult" if age >= 18 else "a child"}.')
I am an adult.
>>>

Краткая история форматирования строки

Форматирование строки в Python дается давно. Оригинальное форматирование с использованием % Знак существовал в Python с момента версии 1.x (и даже до этого в C, который находится в том, где происходит вдохновение этой функции). Это позволило вам делать большинство строк форматирования очень легко, хотя синтаксис был немного необычным: он использует % Флаги в вашей строке, которые заменяются значениями, в которых вы проходите. Вот пример:

>>> city = 'London'
>>> print('She lives in %s since %d' % (city, 2000))
She lives in London since 2000
>>>

Там есть куча этих % Узоры, и каждый из них имеет значение:

  • % s – Нить
  • %c – символ (ASCII/Unicode)
  • %d – цифры (целое число)
  • % f – Поплавки
  • % x – шестнадцатеричное число и т. Д.

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

  • % 9s означает строку длины 9.
  • % -7d означает целое число длины 7, но выровненный левый Отказ
>>> print('%15f seconds' % 31.415926)
      31.415926 seconds
>>> print('%-15f seconds' % 31.415926)
31.415926       seconds
>>>

В конце концов, люди поняли, что % Синтаксис заимствован у C, может быть не самый читаемый способ форматирования строк. Таким образом, в Python 3.0 (наряду 2,6) был добавлен новый метод ул ...| Тип данных: str.format Отказ Это было не только более очевидно в том, что он делал, он добавил кучу новых функций, таких как динамические типы данных, выравнивание центра, форматирование на основе индекса и указание персонажей для заполнения. Вот несколько примеров:

>>> month = 'May'
>>> print('I was born in {}.'.format(month))
I was born in May
>>> blog_title = 'What the f-string?'
>>> print('{title:-^30}'.format(title=blog_title))
------What the f-string?------
>>> print('{:_<15f} seconds'.format(31.415926))
31.415926______ seconds
>>> print('{:>15f} seconds'.format(31.415926))
      31.415926 seconds

Обратите внимание, что если вы не укажете символ выравнивания, используя < , > или ^ , это будет всегда по умолчанию для левого выравнивания. Это отличается от % – Формат, как это по умолчанию для правильного выравнивания для чисел.

Вместе с str.format Метод, есть также встроенный формат Функция, которая делает то же самое.

Для намного больше информации о % ФОРМАТ и str.format и все их (много) особенности, направляйтесь к pyformat.info. . Это очень полезно в качестве ссылки на функции и синтаксис.

Почему F-струны?

Одна вещь, которую вы должны знать, это то, что str.format () Можете уже сделать (почти) все, что может сделать F-струны. Вам может быть интересно, – почему F-Strings созданы в первую очередь? И зачем Я заботиться о них? “

Ну, это по двум причинам:

  • Это путь более интуитивно понятным , и
  • Это Поиск более читаемое Отказ

Вот сравнение:

>>> name, age = 'Mark', 31
>>> # str.format version
>>> print('Hi, I'm {0} and I'm {1} years old.'.format(name, age)
Hi, I'm Mark and I'm 31 years old.
>>> # f-string version
>>> print(f'Hi, I'm {name} and I'm {age} years old.')
Hi, I'm Mark and I'm 31 years old.

Эти два свойства, будучи интуитивным и читаемым, являются частью основной философии Python (см. Zen of Python ).

Больше примеров

Теперь несколько примеров во всем, что вы можете сделать с F-струнами.

Прокладки/усечение

>>> pi = 3.141592
>>> print(f'{pi}')
3.141592
>>> print(f'{pi:10}')     # padding to make length 10
  3.141592
>>> print(f'{pi:010}')    # padding with zeroes
003.141592
>>> print(f'{pi:.3}')     # 3 digits total, ignoring decimal
3.14
>>> string = "Hello! this is a string"
>>> print(f'{string:.6}')  # 6 characters
'Hello!'

Выравнивание

>>> heading = 'Test'
>>> print(f'{heading:>20}')
                Test
>>> print(f'{heading:~>20}')  # specify alignment for custom padding
~~~~~~~~~~~~~~~~Test
>>> print(f'{heading:_<20}')
Test________________
>>> print(f'{heading:=^20}')
========Test========
>>> 

Округление номеров

>>> num = 2.136
>>> print(f'{num}')
2.136
>>> print(f'{num:.3}')  # Rounded up
2.14
>>> print(f'{num:.2}')  # Rounded down
2.1
>>> 

Преобразование типов

>>> print(f'{42:c}')       # int to ascii
*
>>> print(f'{604:f}')      # int to float
604.000000
>>> print(f'{84:.2f}%')
84.00%
>>> print(f'{604:x}')      # int to hex
25c
>>> print(f'{604:b}')      # int to binary
1001011100
>>> print(f'{604:0>16b}')  # int to binary, with zero-padding
0000001001011100
>>> 

Добавление запятых в большие номера

>>> large_num = 12_345_678  # int syntax supports underscores :D
>>> print(f'{large_num}')
12345678
>>> print(f'{large_num:,}')
12,345,678

Специальный синтаксис

Есть несколько специальных синтаксисов, которые не существуют в оригинале % ФОРМАТ:

! S! R и! a

>>> from datetime import datetime
>>> datetime.now()                # repr value
datetime.datetime(2021, 7, 6, 2, 21, 56, 698285)
>>> print(datetime.now())         # str value
2021-07-06 02:22:02.772826     
>>> print(f'{datetime.now()}')    # str value by default
2021-07-06 02:22:14.357562
>>> print(f'{datetime.now()!r}')  # repr value
datetime.datetime(2021, 7, 6, 2, 22, 17, 709937)
>>> print(f'{datetime.now()!s}')  # str value
2021-07-06 02:22:20.081837
>>> sparkles = '✨'
>>> print(f'{sparkles}')
✨
>>> print(f'{sparkles!a}')        # ascii-safe value
'\u2728'

Форматирование данных

>>> from datetime import datetime
>>> print(f'{datetime.now():%A, %B %d %Y}')
Tuesday, July 06 2021

Для получения дополнительной информации о % Коды специально для объектов DateTime, проверьте документацию для datetime.strftime или проверить strftime.org Отказ

{x= } синтаксис

Это новый синтаксис, который был добавлен в Python 3.8, и он поможет вам быстро распечатать значение переменной, обычно для целей отладки. По сути, f '{abc =}' такой же, как f'abc = {abc! r} ' Отказ

>>> x, y = 3, 5
>>> print(f'{x=}')
x=3
>>> print(f'{x = }')
x = 3
>>> x, y = y, x+y
>>> print(f'{x=} {y=}')
x=5 y=8
>>> string = 'test'.center(10, '*')
>>> print(f'{string = }')
string = '***test***'
>>> print(f'{10 * 2 = }')
10 * 2 = 20
>>> 

Вложенный форматирование

Так как мы иногда можем иметь довольно сложные спецификации формата, такие как ~ ^ 30s или 0> 12, .2F Имеет смысл иметь возможность извлечь их в переменные. И это именно то, что вложенное форматирование Позвольте нам сделать.

Некоторые вещи, которые вы можете сделать с

  • Переменная длина прокладки
>>> string = 'Python'
>>> size = 20
>>> print(f'{string:{size}}')
~~~~~~~Python~~~~~~~
>>>
  • Помещая в формате SPEC в виде переменной или в виде нескольких переменных:
from math import pi

digits = int(input('Enter number of digits of pi: '))
length = int(input('Enter string length: '))
alignment = input('Enter alignment (<, > or ^): ')
padding_char = input('Enter padding character: ')
print(f'{pi:{padding_char}{alignment}{length}.{digits}}')

Вывод:

Enter number of digits of pi: 8   
Enter string length: 30
Enter alignment (<, > or ^): ^
Enter padding character: _
__________3.1415927___________

Пользовательское форматирование с использованием __format__

Вы можете определить пользовательские обработки формата в своих собственных объектах, переопределяя __Format__ Метод на объекте Fixter. Это позволяет определять (в основном) произвольную семантику форматирования.

Вот пример, с более разумными именами для форматирования DateTime:

from datetime import datetime

class BetterDatetime(datetime):
    substitutions = {
        '%day': '%A',
        '%date': '%d',
        '%monthname': '%B',
        '%month': '%m',
        '%year': '%Y'
    }

    def __format__(self, format_spec):
        for token, replacement in self.substitutions.items():
            format_spec = format_spec.replace(token, replacement)

        return super().__format__(format_spec)

print(f'Today is {BetterDatetime.now():%day, %date %monthname %year}')

# Output: Today is Monday, 8 July 2021

Ограничения

Как удивительно, как F-Strings, они не являются всеми и конец – все форматирование строк в Python. (Но они очень близко!)

Некоторые нитепики с моей стороны о F-струнах:

  • Вы не можете отделить шаблон строки из встроенных данных. В str.format вы можете хранить сами строки как шаблоны в отдельном файле, как текст Отказ Тогда вы можете импортировать текст и использовать text.format (user = ...) . Вы не можете сделать это с F-струнами.

  • F-струны работают только в Python 3.6+, а {x =} Синтаксис работает только в Python 3.8+

  • Также нет реальной замены для str.format_map Способ с использованием F-струн.

Вывод

Все вообще, F-Strings потрясающие, и все должны их использовать: P

В любое, если у вас есть какие-либо вопросы или предложения, бросьте их ниже. Я хотел бы услышать от вас ✨

Оригинал: “https://dev.to/tusharsadhwani/what-the-f-strings-391c”