Как печатать как printf в Python3?


125

В Python 2 я использовал:

print "a=%d,b=%d" % (f(x,n),g(x,n))

Я пробовал:

print("a=%d,b=%d") % (f(x,n),g(x,n))

11
%всегда был строковым оператором, не связанным с printоператором. Вы можете, например, создать строку с помощью s="a=%d,b=%d"%(f(x,n),g(x,n)), а затем распечатать эту строку с помощью print s.
chepner

Ответы:


207

В Python2 printбыло ключевое слово, которое вводило оператор:

print "Hi"

В Python3 printэто функция, которая может быть вызвана:

print ("Hi")

В обеих версиях %это оператор, который требует строки слева и значения или кортежа значений или объекта сопоставления (например dict) справа.

Итак, ваша строка должна выглядеть так:

print("a=%d,b=%d" % (f(x,n),g(x,n)))

Кроме того, для Python3 и новее рекомендуется использовать {}форматирование -style вместо %форматирования -style:

print('a={:d}, b={:d}'.format(f(x,n),g(x,n)))

Python 3.6 представляет еще одну парадигму форматирования строк : f-строки .

print(f'a={f(x,n):d}, b={g(x,n):d}')

14
или: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) где в этом примере показано, как можно использовать модификаторы стиля printf и по- прежнему использовать ключевые слова.
fbicknel

2
@rapt, у него есть огромные преимущества. Не в последнюю очередь вы можете ссылаться на один и тот же формат только несколько раз или в произвольном порядке: "{1}, {1}, {0} и {1}" .format ("яйца", "спам") = = «спам, спам, яйца и спам»
д-р Xorile

53

Самый рекомендуемый способ - использовать formatметод. Подробнее об этом здесь

a, b = 1, 2

print("a={0},b={1}".format(a, b))

28

Простая функция printf () из Поваренной книги Python О'Рейли .

import sys
def printf(format, *args):
    sys.stdout.write(format % args)

Пример вывода:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14

Хех ... PRINTи FORMAT...? Назад во времени 60+ лет назад во времена FORTRAN :)
Скив

1
Ссылка на поваренную книгу О'Рейли мертва.
Идеограмма

22

Python 3.6 представил f-строки для встроенной интерполяции. Что еще приятнее, так это то, что он расширил синтаксис, чтобы также разрешить спецификаторы формата с интерполяцией. Что-то, над чем я работал, пока гуглил (и натолкнулся на этот старый вопрос!):

print(f'{account:40s} ({ratio:3.2f}) -> AUD {splitAmount}')

У PEP 498 есть подробности. И ... он отсортировал мою любимую мозоль с помощью спецификаторов формата на других языках - позволяет спецификаторам, которые сами могут быть выражениями! Ура! См .: Спецификаторы формата .


2
Примечание. Это также наиболее эффективный способ вставки переменных в строки.
Rotareti


11

Более простой.

def printf(format, *values):
    print(format % values )

Затем:

printf("Hello, this is my name %s and my age %d", "Martin", 20)

2

Поскольку ваш %находится за пределами print(...)круглых скобок, вы пытаетесь вставить свои переменные в результат вашего printвызова. print(...)возвращается None, так что это не сработает, и есть небольшая проблема, что вы уже напечатали свой шаблон к этому времени, а путешествия во времени запрещены законами вселенной, в которой мы живем.

Все, что вы хотите напечатать, включая %и его операнд, должно быть внутри вашего print(...)вызова, чтобы строку можно было построить до ее печати.

print( "a=%d,b=%d" % (f(x,n), g(x,n)) )

Я добавил несколько дополнительных пробелов, чтобы было понятнее (хотя они не нужны и обычно не считаются хорошим стилем).


2

Другими словами, printf отсутствует в python ... Я удивлен! Лучший код

def printf(format, *args):
    sys.stdout.write(format % args)

Из-за этого форма позволяет не печатать \ n. Все остальные нет. Вот почему печать - плохой оператор. А еще нужно писать аргументы в специальной форме. В функции выше недостатков нет. Это стандартная обычная форма функции printf.


1
Вы можете тривиально избежать \ n в печати. Просто добавьте "," после значения, которое нужно напечатать.
Hejazzman

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.