Як друкувати як 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.
чепнер

Відповіді:


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-string .

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 ("яйця", "спам") = = "спам, спам, яйця та спам"
Д-р Ксоріле

53

Найбільш рекомендований спосіб - це використовувати formatметод. Детальніше про це читайте тут

a, b = 1, 2

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

28

Проста функція printf () від кухонної книги O'Reilly's 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 :)
Skeeve

1
Посилання на кулінарну книгу O'Reilly мертве.
Ідеограма

22

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

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

PEP 498 містить деталі. І ... це сортувало мого домашнього улюбленця з специфікаторами формату в інших мовах - дозволяє специфікаторам, що самі можуть бути виразами! Так! Див.: Специфікатори форматування .


2
Примітка. Це також найефективніший спосіб введення змінних у рядки.
Ротарети


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.