Como imprimir como printf no Python3?

125

No Python 2 eu usei:

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

Eu tentei:

print("a=%d,b=%d") % (f(x,n),g(x,n))
Mike L
fonte
11
%sempre foi um operador de cadeia, não relacionado à printinstrução Você pode, por exemplo, criar uma sequência com s="a=%d,b=%d"%(f(x,n),g(x,n)), e imprimi-la com print s.
Chepner # 18/13

Respostas:

207

No Python2, printhavia uma palavra-chave que introduzia uma declaração:

print "Hi"

No Python3, printé uma função que pode ser chamada:

print ("Hi")

Nas duas versões, % é um operador que requer uma sequência no lado esquerdo e um valor ou uma tupla de valores ou um objeto de mapeamento (como dict) no lado direito.

Portanto, sua linha deve ficar assim:

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

Além disso, a recomendação para Python3 e mais recente é usar a {}formatação -style em vez de% formatação -style:

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

O Python 3.6 introduz ainda outro paradigma de formatação de strings : f-strings .

print(f'a={f(x,n):d}, b={g(x,n):d}')
Robᵩ
fonte
14
ou: print('a={first:4.2f}, b={second:03d}'.format(first=f(x,n),second=g(x,n))) onde este exemplo mostra como você pode usar os modificadores de estilo printf e ainda usar palavras-chave.
Fbicknel
2
@rapt, tem algumas vantagens enormes. Além disso, você pode fazer referência ao mesmo formato apenas várias vezes ou fora de ordem: "{1}, {1}, {0} e {1}" .format ("eggs", "spam") = = "spam, spam, ovos e spam"
Dr. Xorile 12/02
53

A maneira mais recomendada de fazer é usar o formatmétodo Leia mais sobre isso aqui

a, b = 1, 2

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

Função printf () simples do Python Cookbook de O'Reilly .

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

Exemplo de saída:

i = 7
pi = 3.14159265359
printf("hi there, i=%d, pi=%.2f\n", i, pi)
# hi there, i=7, pi=3.14
stackoverflowuser2010
fonte
Heh ... PRINTe FORMAT...? Voltar no tempo 60 + anos para os dias de Fortran :)
Skeeve
1
O link para o livro de receitas de O'Reilly está morto.
Ideograma
22

O Python 3.6 introduziu f-strings para interpolação em linha. O que é ainda melhor é que ela estendeu a sintaxe para permitir também especificadores de formato com interpolação. Algo em que eu estava trabalhando enquanto pesquisava isso no Google (e me deparei com essa pergunta antiga!):

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

O PEP 498 tem os detalhes. E ... classificou minha irritação com especificadores de formato em outros idiomas - permite especificadores que podem ser expressões! Yay! Consulte: Especificadores de formato .

kva1966
fonte
2
Nota: Essa também é a maneira mais eficiente de injetar variáveis ​​em seqüências de caracteres.
Rotareti 26/09/17
17

Exemplo simples:

print("foo %d, bar %d" % (1,2))

Donald Derek
fonte
11

Um mais simples.

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

Então:

printf("Hello, this is my name %s and my age %d", "Martin", 20)
Toure da família
fonte
2

Como você %está fora dos print(...)parênteses, você está tentando inserir suas variáveis ​​no resultado da sua printchamada. print(...)retorna None, para que isso não funcione, e também há a pequena questão de você já ter impresso seu modelo nessa viagem no tempo e no tempo sendo proibida pelas leis do universo em que habitamos.

A coisa toda que você deseja imprimir, incluindo o %operando e, precisa estar dentro da sua print(...)chamada, para que a cadeia possa ser criada antes de ser impressa.

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

Adicionei alguns espaços extras para torná-lo mais claro (embora eles não sejam necessários e geralmente não sejam considerados bons estilos).

kindall
fonte
2

Outras palavras printf ausente em python ... Estou surpreso! O melhor código é

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

Por causa deste formulário, permite não imprimir \ n. Todos os outros não. É por isso que a impressão é ruim de operação. E você também precisa escrever args de forma especial. Não há desvantagens na função acima. É uma forma usual padrão da função printf.

Anatoliy
fonte
1
Você pode evitar trivialmente \ n na impressão. Basta adicionar "," após o valor a ser impresso.
precisa saber é o seguinte
1
print("Name={}, balance={}".format(var-name, var-balance))
Usuário707
fonte