Перейти к содержанию

Python работа с функцией print + "format/f-строка"

Назначение

Функция print необходима для вывода в stdout форматированных данных.

Варианты работы

Стандартный формат вывода

# Вывод текста 
In [78]: print("test")                                                                                           
test

# Вывод содержимого переменной
In [79]: a = "test"                                                                                              

In [80]: print(a)                                                                                                
test

# Вывод содержимого нескольких переменных
In [83]: a = 10                                                                                                  

In [84]: b = "test"                                                                                              

In [85]: print(a, b)                                                                                             
10 test

# Вывод смешанный
In [94]: print("Here is", b, 10)                                                                                 
Here is test 10

Использования format

# Вывод 
In [95]: a = 10                                                                                                  

In [96]: b = "test"                                                                                              

In [97]: print("Here is {} {}".format(b, a))                                                                     
Here is test 10

# Вывод в двоичном формате - b
In [98]: print("Here is {:s} {:b}".format(b, a))                                                                 
Here is test 1010

# Шаблон для format - можно задать в отдельной переменной
In [110]: template = "Here is {:s} {:b}"                                                                         

In [111]: print(template.format(b, a))                                                                           
Here is test 1010


# Отступы и форматирование вывода

In [159]: ip = "192.168.0.1"                                                              
In [160]: mac = "0000.desd.beef"                                                           
In [161]: vlan = 100                                                                                             

## 15 знаков для каждой переменной
## оставшееся пространство "15" заполняется пробелами
In [162]: print("{:15} {:15} {:15}".format(ip, mac, vlan))                                                       
192.168.0.1     0000.desd.beef              100


## 15 знаков для каждой переменной 
## форматирование по правому краю
## оставшееся пространство "15" заполняется пробелами
In [163]: print("{:>15} {:>15} {:>15}".format(ip, mac, vlan))                                                    
    192.168.0.1  0000.desd.beef             100


## 15 знаков для каждой переменной 
## форматирование по левому краю
## оставшееся пространство "15" заполняется пробелами
In [164]: print("{:<15} {:<15} {:<15}".format(ip, mac, vlan)
)                                                    
192.168.0.1     0000.desd.beef  100     


## 15 знаков для каждой переменной 
## форматирование по левому краю
## оставшееся пространство "15" заполняется пробелами
## представление влан в бинароном виде
In [165]: print("{:<15} {:<15} {:b}".format(ip, mac, vlan))                                                      
192.168.0.1     0000.desd.beef  1100100


## 15 знаков для каждой переменной 
## форматирование по левому краю
## оставшееся пространство "15" заполняется пробелами
## представление влан в бинароном виде в 8-ми значном виде
## недостающие знаки в влане заполняются нулями
In [168]: print("{:<15} {:<15} {:08b}".format(ip, mac, vlan))                                                    
192.168.0.1     0000.desd.beef  01100100

## 15 знаков для каждой переменной 
## форматирование по левому краю
## оставшееся пространство "15" заполняется пробелами
## представление влан в бинароном виде в 8-ми значном виде
## недостающие знаки в влане заполняются нулями
## нули добираться справа!!!
In [171]: print("{:<15} {:<15} {:<08b}".format(ip, mac, vlan))                                                   
192.168.0.1     0000.desd.beef  11001000


## А вот совсем странное...
## 15 знаков для каждой переменной - нули добираться справа!!!
## форматирование по левому краю
## оставшееся пространство "15" заполняется пробелами
## представление влан в бинароном виде в 8-ми значном виде
## недостающие знаки в влане заполняются нулями
In [174]: print("{:<015} {:<015} {:<08b}".format(ip, mac, vlan))                                                 
192.168.0.10000 0000.desd.beef0 11001000

Шаблон для format

# Шаблон для format  удобно использовать для сложного форматирования

In [121]: items = ["Prefix", "AD/Metric", "Next-Hop", "Last update", "Outbound Interface"]                       
In [122]: values = ['10.0.24.0/24', '110/41', 'via', '10.0.13.3', '3d18h', 'FastEthernet0/0']                    

In [114]: template = "{:25} {}\n" * 5                                                                            

In [115]: template                                                                                               
Out[115]: '{:25} {}\n{:25} {}\n{:25} {}\n{:25} {}\n{:25} {}\n'

In [124]: print(template.format( 
     ...:         items[0],values[0], 
     ...:         items[1],values[1], 
     ...:         items[2],values[2], 
     ...:         items[3],values[3], 
     ...:         items[4],values[4], 
     ...: ),end="")            

Prefix                    10.0.24.0/24
AD/Metric                 110/41
Next-Hop                  via
Last update               10.0.13.3
Outbound Interface        3d18h

Шаблон для format с указанием индексов значений

"По сути если значение используется несколько раз в шаблоне,"
"то достаточно указать его индекс в шаблоне в нужногм месте"

ip = "192.168.3.1"

template = """
{0:<8}  {1:<8}  {2:<8}  {3:<8}
{0:>08b}  {1:>08b}  {2:>08b}  {3:>08b}
"""

l = ip.split(".")

print(template.format(int(l[0]), int(l[1]), int(l[2]), int(l[3])))

"output"
192       168       3         1       
11000000  10101000  00000011  00000001
"Для особых изощренцев можно сделать и через f-строки"
ip = "192.168.3.1"

print(f''' 
{int(l[0]):<8}  {int(l[1]):<8}  {int(l[2]):<8}  {int(l[3]):<8} 
{int(l[0]):>08b}  {int(l[1]):>08b}  {int(l[2]):>08b}  {int(l[3]):>08b}''') 

"output"
192       168       3         1       
11000000  10101000  00000011  00000001

Важное отличие f-строки от format

f-строки это выражение, которое выполняется, а не просто строка, п.э.
если при вызове f-строки ничего неизвестно о переменных в ней, то возникнет ошибка.

Литература


Последнее обновление: 2023-05-29