1 minute read

f-строки и format

f-строки появились в python 3.6 и считаются более понятным и быстрым способом форматирования строк. Простые примеры использования f-строк:

In [1]: a = ['10', '1', '1', '1']
   ...: b = '24'
   ...: print(f"{'.'.join(a)}/{b}")
10.1.1.1/24
In [2]: ip_list = ['10.1.1.1/24', '10.2.2.2/24', '10.3.3.3/24']
   ...: print(f"{len(ip_list)}")
3

Для f-строк:

  • не получится заранее задать шаблон, а потом его использовать. Если нужен шаблон, лучше использовать format
  • внутри конструкции можно использовать методы и функции
  • выполняются сразу, как только до выражения дошла очередь, работают быстрее, чем format

При использовании format переменные можно задавать в теле:

In [3]: print("{}/{}".format('10.1.1.1', '24'))
10.1.1.1/24
In [4]: print("{ip}/{mask}".format(ip='10.1.1.1', mask='24'))
10.1.1.1/24

При использовании f-строк переменные необходимо определить заранее во избежание ошибки:

In [5]: ip = '10.1.1.1'
   ...: mask = '24'
   ...: print(f"{ip}/{mask}")
10.1.1.1/24

f-строки удобно применять в циклах:

In [6]: ip_list = ['10.1.1.1/24', '10.2.2.2/24', '10.3.3.3/24']
   ...: for address in ip_list:
   ...:     ip, mask = address.split('/')
   ...:     print(f"ip: {ip}, mask: {mask}")
   ...:
ip: 10.1.1.1, mask: 24
ip: 10.2.2.2, mask: 24
ip: 10.3.3.3, mask: 24

Можно использовать те же значения, что и в format. Например, так:

In [7]: ip_list = ['10.1.1.1', '10.2.2.2', '10.3.3.3']
   ...: for address in ip_list:
   ...:     oct1, oct2, oct3, oct4 = address.split('.')
   ...:     print(f'''
   ...:     ip: 
   ...:     {oct1:<8} {oct2:<8} {oct3:<8} {oct4:<8}
   ...:     {int(oct1):08b} {int(oct2):08b} {int(oct3):08b} {int(oct4):08b}
   ...:     ''')
   ...:

    ip: 
    10       1        1        1       
    00001010 00000001 00000001 00000001
    

    ip: 
    10       2        2        2       
    00001010 00000010 00000010 00000010
    

    ip: 
    10       3        3        3       
    00001010 00000011 00000011 00000011

Иногда format удобнее, чем f-строки. Например, если заранее необходимо определить шаблон, который будет применяться в скрипте много раз. В случае f-строк можно применить функцию (но создание функции только для вывода строки по шаблону не имеет смысла):

In [8]: def show_me_ip(ip, mask):
    ...:     return f"IP: {ip}, mask: {mask}"

In [9]: show_me_ip('10.1.1.1', 24)
Out[9]: 'IP: 10.1.1.1, mask: 24'

Полезные ссылки и источники примеров: