Muitas vezes, o senhor precisará formatar e arredondar um valor em Python float
para exibir os resultados de seus cálculos de forma organizada em strings. Nas versões anteriores do Python, isso era uma coisa complicada de se fazer porque o senhor precisava arredondar os números primeiro e, em seguida, use a concatenação de strings ou o formatação de string antiga para fazer isso para o senhor.
Desde o Python 3.6, a função interpolação de string literalmais comumente conhecida como literal de string formatada ou f-stringpermite que o senhor personalize o conteúdo de suas cadeias de caracteres de forma mais legível.
Uma string f é uma string literal prefixada com uma letra minúscula ou maiúscula f
e contém zero ou mais campos de substituição dentro de um par de chaves {...}
. Cada campo contém um expressão que produz um valor. O senhor pode calcular o conteúdo do campo, mas também pode usar chamadas de função ou até mesmo variáveis.
Embora a maioria das strings tenha um valor constante, as f-strings são avaliadas em tempo de execução. Isso permite que o senhor passe dados diferentes para os campos de substituição da mesma f-string e produza resultados diferentes. Essa extensibilidade das f-strings faz com que elas sejam uma ótima maneira de incorporar conteúdo dinâmico de forma organizada dentro das strings. Entretanto, embora as f-strings tenham substituído amplamente os métodos anteriores, elas têm suas deficiências.
Por exemplo, um dos ataques mais comuns realizados em uma banco de dados relacional é um Injeção de SQL ataque. Muitas vezes, os usuários fornecem parâmetros para consultas SQL e, se a consulta for formada dentro de uma string F, pode ser possível danificar um banco de dados passando comandos não autorizados. As f-strings também podem ser usadas em um negação de serviço ataque ao atacar O módulo de registro do Python código.
Em versões mais antigas do Python, as f-strings tinham uma série de outras limitações que só foram corrigidas com o Python versão 3.12. Essa versão é usada em todo este tutorial.
Dê uma olhada no exemplo abaixo. Ele mostra como incorporar o resultado de um cálculo em uma string f:
Sem nenhum arredondamento explícito, uma vez que uma expressão tenha produzido seu valor, ela será inserida na string usando um número padrão de casas decimais. Aqui, o resultado é mostrado com dezesseis casas decimais, o que, na maioria dos casos, é mais preciso do que o senhor jamais precisará. Portanto, é provável que o senhor queira arredondar a resposta final para um número mais prático de dígitos.
Neste tutorial, o senhor aprenderá a usar uma string f do Python para formatar floats de acordo com suas necessidades.
Faça o teste: Teste seus conhecimentos com o nosso teste interativo “Format Floats Within F-Strings”. Após a conclusão, o senhor receberá uma pontuação para que possa acompanhar o progresso do seu aprendizado ao longo do tempo:
Questionário interativo
Formatar flutuadores em strings F
Neste teste, o senhor testará sua compreensão de como formatar números flutuantes dentro de strings f em Python. Esse conhecimento permitirá que o senhor controle a precisão e a aparência dos números de ponto flutuante quando os incorporar em cadeias formatadas.
Como formatar e arredondar um float em uma string F em Python
Para formatar um float
para uma exibição organizada em uma string f do Python, o senhor pode usar um especificador de formato. Em sua forma mais básica, isso permite que o senhor defina o precisãoou número de casas decimais, o float
será exibido com.
O código abaixo exibe o mesmo cálculo de antes, só que de forma mais organizada:
Para usar os especificadores de formato do Python em um campo de substituição, separe-os da expressão com dois pontos (:
). Como o senhor pode ver, seu float
do senhor foi arredondado com duas casas decimais. O senhor conseguiu isso adicionando o especificador de formato .2f
no campo de substituição. O senhor 2
é a precisão, enquanto a letra minúscula f
é um exemplo de um tipo de apresentação. O senhor verá mais desses tipos mais tarde.
Observação: Quando o senhor usa um especificador de formato, na verdade não altera o número subjacente. O senhor apenas melhora sua exibição.
As f-strings do Python também têm seus próprios mini-linguagem que permite que o senhor formate a saída de várias maneiras diferentes. Embora este tutorial se concentre no arredondamento, certamente não é a única coisa para a qual o senhor pode usá-los. Como o senhor verá mais adiante, a mini-linguagem deles também é usada em outras técnicas de formatação de strings.
Além de exibir o resultado dos cálculos, a parte de precisão de um especificador de formato também pode ser aplicada diretamente às variáveis e aos valores de retorno das chamadas de função:
Desta vez, o senhor usou vários campos de substituição na mesma string. O primeiro formata um número literal, o segundo formata o resultado de um cálculo, enquanto o terceiro formata o valor de retorno de uma chamada de função. Além disso, ao inserir uma vírgula (,
) antes do ponto decimal (.
) no especificador de formato, o senhor adiciona um separador de milhares à saída final.
No dia a dia, os números são exibidos com uma quantidade fixa de casas decimais, mas, ao realizar cálculos científicos ou de engenharia, o usuário pode preferir formatá-los usando algarismos significativos. Presume-se então que seus resultados sejam precisos para o número de algarismos significativos que o senhor os exibe.
Se quiser arredondar os números para algarismos significativos, use a letra minúscula g
no especificador de formato. O senhor também pode usar uma letra maiúscula G
mas isso muda automaticamente o formato para notação científica para números grandes.
Suponha que o senhor tenha um círculo com um raio de 10,203 metros. Para calcular a área, o senhor poderia usar este código:
O senhor decide usar o valor do pi
fornecida pela constante do Python math
do Python. Embora sua resposta certamente pareça altamente precisa, grande parte dela não tem sentido. Qualquer cálculo é tão preciso quanto o menor número de algarismos significativos em qualquer um de seus componentes. Nesse caso, o valor do raio de 10.203
contém apenas cinco algarismos significativos, o que é menor que math.pi
portanto, é para esse valor que o resultado final deve ser arredondado.
Uma maneira melhor de codificar esse cálculo seria:
A área, com cinco algarismos significativos, é de 327,04 metros quadrados.
O senhor também pode usar especificadores de formato para exibir números como porcentagens. Para fazer isso manualmente, o senhor precisa multiplicar o número por cem e anexá-lo a um sinal de porcentagem (%
) antes de exibi-lo com a quantidade necessária de casas decimais. O senhor pode fazer tudo isso automaticamente usando a função %
no lugar da letra minúscula f
ou g
:
Como o senhor pode ver, o .2%
cuidou da multiplicação, do arredondamento e da %
apêndices para o senhor automaticamente.
Agora o senhor sabe como lidar com os cenários mais comuns em que precisará formatar floats dentro de uma string f em Python. Você aprenderá mais na próxima seção, mas, antes de prosseguir, expanda a seção abaixo e veja se consegue concluir as tarefas. Trabalhar com elas é uma ótima maneira de revisar e consolidar seu conhecimento até agora.
Tarefa 1: Usando number = 64723.4161
, veja se o senhor consegue escrever uma única linha de código para produzir a saída mostrada. Além daqueles necessários para o especificador de formato, sua string não deve conter outros números:
Tarefa 2: Comece com as variáveis numerator = 3
e denominator = 8
e veja se o senhor consegue escrever uma única linha de código para produzir a saída mostrada. Novamente, sua string não deve conter outros números além daqueles necessários para o especificador de formato:
Tarefa 3: Calcule o volume de um esfera cujo raio é de 2,340 metros. Sua resposta deve ser exibida com um número apropriado de algarismos significativos.
Os senhores encontrarão possíveis soluções nos materiais para download que acompanham este tutorial.
Agora, é hora de seguir em frente e aprender sobre outras maneiras de aprimorar a exibição dos números em cadeias de caracteres.
Personalização da largura de suas cadeias de caracteres formatadas
Além de sua precisão, os especificadores de formato contêm um largura parâmetro. Isso permite que o senhor defina o número total de caracteres usados para exibir o número. Se o comprimento do número exceder o parâmetro width (largura), será atribuído espaço adicional. Caso contrário, o resultado será preenchido com espaços à esquerda até a largura especificada. Supondo que o senhor tenha definido a largura para caber no maior número, cada número terá o mesmo comprimento fixo que os outros.
Os registros de comprimento fixo são úteis para salvar em um arquivo. A comprimento fixo é um arquivo cujos campos de registro ocupam todos o mesmo número de caracteres. Normalmente, os campos são preenchidos com caracteres adicionais, mais comumente espaços finais para texto e zeros iniciais para números.
Os arquivos de comprimento fixo existem há anos e o senhor ainda os vê hoje em dia. Embora o senhor encontre formatos como XML e YAML mais fácil de ler manualmente, os arquivos de tamanho fixo ainda oferecem algumas vantagens. Seu código pode ler registros de comprimento fixo com muita eficiência porque cada campo dentro de cada registro está na mesma posição. Por outro lado, os analisadores XML geralmente exigem mais recursos, principalmente se o senhor tiver que lidar com grandes volumes de dados.
No entanto, os arquivos de comprimento fixo geralmente são mais específicos do aplicativo do que outros formatos, o que significa que não é possível transferi-los facilmente entre sistemas. Além disso, o uso de um analisador com XML e YAML permite que o senhor adicione e leia rapidamente campos adicionais. Em contrapartida, a atualização de campos de tamanho fixo geralmente envolve uma grande recodificação de cada programa que precisa trabalhar com eles.
Para ver o efeito do parâmetro width, dê uma olhada no código mostrado abaixo:
Em cada um desses quatro resultados, a precisão é definida como .2f
ou seja, tudo é arredondado para duas casas decimais. Como o senhor está lidando com números, eles são preenchidos à esquerda com espaços em branco por padrão. O senhor usou um caractere de nova linha (\n
) como um separador de valores para imprimir cada saída em sua própria linha. O senhor também exibiu cada número entre os caracteres pipe (|
) para enfatizar o preenchimento.
No primeiro resultado, nenhuma largura foi especificada, portanto, a string f cuidou disso para o senhor e dimensionou a string para conter tudo antes do ponto decimal, bem como os dois dígitos especificados depois.
No segundo exemplo, a largura é muito pequena para acomodar a saída, portanto, ela é redimensionada para permitir que a cadeia de caracteres caiba.
No terceiro exemplo, a largura é exatamente o tamanho necessário, portanto, não há preenchimento e, novamente, ocorre o mesmo resultado.
O exemplo final mostra que o preenchimento foi aplicado à saída. A largura é de quatro caracteres além do necessário, portanto, quatro espaços em branco foram inseridos no início da string.
A menos que o senhor precise desse preenchimento adicional, geralmente é melhor ignorar completamente o valor da largura e deixar que a string f cuide disso para o senhor.
Observação: Por padrão, quando o senhor aplica um parâmetro de largura de campo a uma cadeia de caracteres, o preenchimento é colocado à direita:
Como o senhor pode ver, espaços adicionais foram adicionados à direita da string para aumentar sua largura para 10
caracteres. O segundo exemplo mostra que o número foi colocado à esquerda, mas ainda com a mesma 10
caracteres. Se o senhor tivesse especificado um parâmetro de precisão, como .2f
para a string, o senhor teria gerado um ValueError
. As cadeias de caracteres não entendem de precisão. O senhor aprenderá mais sobre o uso de strings com especificadores de formato mais adiante neste tutorial.
O senhor também pode controlar o colocação do preenchimento, se o senhor precisar. É possível alinhar seus dados à esquerda, à direita e até mesmo ao centro dentro da largura especificada:
Para controlar o posicionamento do preenchimento, use a opção menos que (<
), maior que (>
), ou caret (^
). Elas permitem que o senhor alinhe o número à esquerda, à direita e ao centro dentro do valor de largura, respectivamente.
O senhor deve ter notado que somente o três foram adicionados três caracteres de espaço, em vez do quatro que o senhor viu anteriormente. Isso ocorre porque, ao incluir o separador de milhares em seu especificador de formato, o senhor usou um espaço adicional de caracteres.
Agora, suponha que o senhor queira usar o preenchimento, mas prefira um caractere de preenchimento diferente do espaço padrão que usou até agora. Para fazer isso, o senhor adiciona o caractere de preenchimento escolhido antes de a opção de alinhamento:
Neste exemplo, o senhor optou por preencher os números com um asterisco (*
), embora o senhor pudesse ter usado qualquer outro caractere. Para fazer isso, o senhor adicionou o asterisco ao especificador de formato. Seu número foi formatado com as duas casas decimais esperadas e preenchido com um número apropriado de asteriscos para garantir que era o 12
caracteres de largura que o senhor queria.
Controle do posicionamento dos sinais numéricos
Em cada um dos exemplos até agora, o senhor usou números positivos. Sinta-se à vontade para executar novamente qualquer um deles com números negativos, e o senhor verá que um sinal negativo aparecerá ao lado deles. Os números positivos permanecem sem sinal para aderir à suposição usual de que os números sem sinal são positivos.
Suponha que o senhor queira exibir um sinal em cada número para dar ênfase ou esclarecimento, ou para criar registros de comprimento fixo para arquivamento. Para forçar a exibição de um sinal em todos os números, o senhor adiciona o sinal de mais (+
) no especificador de formato, conforme mostrado:
Dessa vez, o número que o senhor usou é negativo. No primeiro exemplo, quando o senhor usa a opção 12,.2f
o sinal negativo aparece. O segundo exemplo apresenta o mesmo resultado, mas o senhor adicionou um sinal de mais ao início do especificador de formato. A vantagem disso só fica evidente quando o senhor nega o número no exemplo três. O sinal de mais (+
) no especificador de formato agora força a exibição do sinal de mais na saída.
Observação: Há um problema antigo na computação com a exibição de cálculos que resultam em um zero. Se parte do cálculo envolver negativos, pode ser exibido um resultado incômodo:
Embora a lógica diga ao senhor que a resposta é um zero sem sinal, o Python, como a maioria das linguagens, insiste em exibir o sinal negativo. Isso acontece devido à forma como os floats são representados na memória. Isso também acontece independentemente de o senhor arredondar para casas decimais, dígitos significativos ou usar o sinal de mais no especificador de formato. Normalmente, isso é algo que o senhor não quer ver.
Felizmente, PEP 682 fornece uma solução que permite que o senhor remova o incômodo sinal negativo (-
) dos zeros. Para isso, o senhor usa a função z
opção conforme mostrado abaixo:
Como o senhor pode ver, o negativo desapareceu e as coisas ficaram mais organizadas.
Agora o senhor sabe como lidar com algumas das complexidades que envolvem a exibição de números arredondados. Ainda há algumas coisas interessantes para o senhor aprender, mas, antes de seguir em frente, é hora de colocar a cabeça para pensar novamente. Por que não ver se o senhor consegue resolver as seguintes tarefas?
Tarefa 4a: Usando sample = -12345.6789
, veja se o senhor consegue escrever uma única linha de código para produzir a saída mostrada. A saída deve ser alinhada à esquerda e ter doze caracteres de largura com duas casas decimais de precisão. Não se esqueça dos separadores de comando e inclua todos os zeros:
Tarefa 4b: Atualize a saída anterior para que ela seja exibida como a mostrada abaixo. É muito semelhante ao resultado anterior, exceto pelo sinal de mais (+
) foi substituído por um espaço. O ideal é que o senhor use um especificador de formato semelhante para ambas as saídas. Lembre-se de consultar a documentação do Python se precisar de ajuda:
Tarefa 5: Comece com result = 5 * 3
e veja se o senhor consegue produzir a saída mostrada sem codificar um símbolo de ponto decimal literal (.
) no final da cadeia de caracteres f. Em vez disso, codifique o ponto decimal à direita usando uma sintaxe de especificador de formato apropriada:
Tarefa 6: Comece com as três variáveis, customer_id = "C123456"
, amount1 = 12.34
, e amount2 = 56.78
e veja se consegue produzir o registro de comprimento fixo conforme mostrado:
A customer_id
deve ser escrito como está, mas o amount1
e amount2
devem ser preenchidos com zero para um comprimento total de oito caracteres e duas casas decimais, conforme mostrado acima.
Os senhores encontrarão possíveis soluções nos materiais para download que acompanham este tutorial.
Agora que o senhor aprendeu a arredondar números do cotidiano e teve a oportunidade de praticar suas habilidades, é hora de ver como formatar números grandes e pequenos, bem como os impossíveis de imaginar números complexos.
Arredondamento da notação científica e dos números complexos
Quando o senhor deseja escrever números muito grandes ou muito pequenos de forma concisa, geralmente usa notação científica. O Python, como muitas outras linguagens de programação, usa notação E para exibir a notação científica, como o senhor pode ver abaixo:

Na figura acima, o senhor pode ver dois exemplos de números formatados com notação científica. O primeiro usa a representação matemática tradicional, enquanto o segundo usa a representação do Python.
O senhor não ficará surpreso ao saber que pode exibir números com notação científica usando especificadores de formato. Veja como o senhor faz isso:
Um especificador comum que o senhor pode usar para formatar números em notação científica é a letra minúscula (e
). Ele usa uma letra minúscula e
em sua exibição.
No primeiro exemplo, como o senhor definiu uma precisão de .2e
sua cadeia de caracteres exibirá o número em notação científica arredondado para duas casas decimais. Também é possível adicionar um valor de largura. Como antes, isso simplesmente comprime o resultado para ajustá-lo à largura, quando necessário.
No segundo exemplo, o senhor está indo na direção oposta e exibindo um número muito pequeno. Como resultado, a notação científica aumenta a potência de dez para -04
. Desta vez, o uso de .3e
exibiu o resultado com três casas decimais.
Como acontece com todos os números que o senhor passa por um especificador de formato, o especificador de formato é apenas uma ferramenta de exibição. Todos os cálculos devem usar o número original para manter a precisão.
O senhor também pode usar especificadores de formato com números complexos. Os números complexos são amplamente usados em engenharia e física para resolver equações relacionadas a oscilações. Eles podem ser usados, por exemplo, como parte de um Transformada de Fourier para remover as frequências de ruído das transmissões genuínas.
Um número complexo é formado por um parte real e um parte imagináriasendo a parte imaginária um múltiplo da raiz quadrada de menos um. Normalmente, eles são escritos na forma a+bi, onde a é chamado de real parte, e o b é chamado de imaginário parte.
Observação: O Python usa a letra j em vez de i para denotar a parte imaginária.
Apesar da natureza um tanto abstrata dos números complexos, o senhor ficará feliz em saber que os especificadores de formato os cobrem:
Como o senhor pode ver, é possível acessar os componentes reais e imaginários do número complexo em uma expressão f-string usando o .real
e .imag
propriedades. Quando tiver essas propriedades, o senhor poderá formatá-las da mesma forma que formata qualquer outro número. O senhor também pode formatar todo o número complexo de uma só vez, aplicando o especificador de formato diretamente a ele.
No exemplo acima, .2f
formata a parte real com duas casas decimais, então .1f
formata a parte imaginária com uma casa decimal. Finalmente, .0f
formata o número completo com zero casas decimais.
Em breve, o senhor se afastará dos métodos básicos de arredondamento de números com especificadores de formato em f-strings e aprenderá como eles podem ser usados de outras maneiras. Antes disso, é hora de enfrentar outro desafio.
Tarefa 7: Usando value = 13579+0.0245j
, veja se o senhor consegue escrever uma única linha de código para produzir a saída mostrada abaixo:
Veja se o senhor consegue descobrir os especificadores de formato necessários. Lembre-se de que o objetivo é obter uma letra maiúscula E
portanto, talvez o senhor precise ler a documentação.
O senhor encontrará possíveis soluções nos materiais para download que acompanham este tutorial.
Usando decimal
Objetos para atenuar imprecisões de ponto flutuante
O Python float
limita o armazenamento dos números a 64 bits. Isso significa que, se algum de seus números exceder esse tamanho, ele não poderá ser representado com precisão. O código abaixo mostra um exemplo:
A resposta exata é um número infinito de três recorrentes. Como o senhor pode ver, um 5
apareceu devido a limitações de espaço.
O senhor pode pensar que usar o especificador de formato .2f
para exibir a saída com duas casas decimais resolveria o problema, mas a imprecisão ainda está presente em segundo plano. Os especificadores de formato apenas arredondam os dados para exibição. Eles não os truncam.
Por exemplo, considere o seguinte cálculo:
O resultado não só mostra que a imprecisão ainda existe, mas que o erro agora entrou na parte inteira do resultado. Outros cálculos agravariam esse problema e levariam a maiores imprecisões no resultado final.
Embora os problemas de precisão que envolvem a aritmética de ponto flutuante nos computadores sejam um problema, a parte inerente de seu projeto, oSe o senhor precisar de garantia de precisão, deve considerar o uso do decimal
em vez disso. Decimal
oferecem mais controle sobre a aritmética de ponto flutuante do que os objetos float
porque permitem que o senhor faça cálculos com uma precisão consistente e defina essa precisão de forma centralizada.
Para ver esse benefício em ação, dê uma olhada no código mostrado abaixo:
O decimal
faz parte da biblioteca padrão do Python, portanto, o senhor não precisa instalá-lo. No entanto, para acessar o módulo Decimal
a partir da qual o senhor instanciará os objetos, ainda é necessário importá-la. Ao importar Decimal
com a letra D
como seu alias, o senhor pode usar o alias ao criar instâncias e, portanto, escrever um código mais conciso.
O senhor também importa o getcontext()
. Quando o senhor usa a função Decimal
no código, muitas de suas principais propriedades são gerenciadas centralmente por seus objeto de contexto. O getcontext()
obtém isso para o senhor. Em seguida, o usuário usa a função .prec
para definir o atributo precisão do senhor Decimal
objetos. Isso define o número de algarismos significativos cada Decimal
conterá. Decimal
As instâncias são arredondadas para se adequarem à sua precisão.
Dê uma olhada na saída do código acima. Quando o senhor usa floats, o erro de representação aparece. No entanto, quando o Decimal
são usadas instâncias, ele não aparece em lugar nenhum. Além disso, o erro também não reaparecerá nunca mais.
A conclusão aqui é que, para uma precisão muito alta, o senhor deve converter as cadeias de caracteres em decimais em vez de floats antes de aplicar um especificador de formato. Isso evita que erros sejam filtrados em seus cálculos, pois tudo o que existia além da precisão especificada terá sido removido com segurança. Além disso, os decimais são mais precisos, com uma precisão padrão de 28 casas, enquanto os floats têm apenas cerca de 16 casas.
Observação: O senhor pode estar se perguntando se deve simplesmente arredondar cada float
usando a função integrada do Python round()
função em vez disso. Essa é certamente uma alternativa para remover erros de representação, mas o objeto de contexto usado pela função decimal
facilita a alteração da precisão de cada número em um único local. A biblioteca também fornece o objeto Decimal.quantize()
para lhe dar um controle ainda mais refinado sobre como o Decimal
os objetos podem ser arredondados.
Para ajudar o senhor a decidir qual valor de precisão usar, considere o conceito de números de guarda. Suponha que o senhor esteja fazendo um cálculo que envolva moeda. Mesmo que o resultado provavelmente contenha dois decimais, os cálculos intermediários devem usar quatro decimais para evitar que o arredondamento afete o resultado final. O senhor deve sempre usar dois números de proteção além de o número de casas decimais que o senhor deseja exibir.
O senhor pode introduzir números de guarda usando uma combinação de especificadores de precisão e de formato. Os especificadores de formato podem ser aplicados a Decimal
da mesma forma que podem ser aplicados a objetos floats:
Para começar, o senhor está somando dois números que contêm pequenas imprecisões em sua forma original. Como o senhor definiu a precisão do contexto como 4
algarismos significativos, eles serão removidos quando cada string for convertida em um Decimal
. Quando o cálculo é feito, o especificador de formato arredonda a resposta exibida para duas casas decimais.
Observação: Embora o decimal
o módulo ofereça excelente suporte a ponto flutuante, ele ainda não consegue resolver os problemas de arredondamento subjacentes associados aos pontos flutuantes.
Dê uma olhada no Decimal
mostrado abaixo:
O senhor poderia esperar que a resposta fosse 0.1000
, dado que a precisão global é 4
. O motivo pelo qual a precisão foi ignorada é que o getcontext().prec
só se aplica aos resultados de uma expressão e não diretamente a um float
. O senhor pode forçar a aplicação da precisão, mas o código é um pouco artificial:
Ao multiplicar por D(1)
o senhor aplicou a precisão de quatro algarismos significativos mais uma vez.
Há ainda algumas outras maneiras de formatar números como cadeias de caracteres em Python, que serão exploradas a seguir.
Formatação de strings de outras maneiras
A função embutida do Python format()
é outra forma de produzir cadeias de caracteres formatadas. A função recebe dois argumentos: o valor a ser formatado mais qualquer um dos especificadores de formato sobre os quais o senhor já aprendeu. Alguns exemplos são mostrados abaixo, com seus equivalentes em f-string incluídos para comparação:
Como o senhor pode ver, a função format()
usa a mesma mini-linguagem de especificação de formato que as f-strings mais modernas. Seu primeiro exemplo usa +9.2f
para exibir uma string que representa um float assinado preenchido com 9
caracteres e arredondado para 2
casas decimais. Em seguida, o senhor usa .2%
para exibir o número com duas casas decimais como uma porcentagem.
Reserve um momento para comparar o código usando format()
com o código usando a f-string, e o senhor verá que a versão da f-string é mais compacta e, em geral, mais legível.
Um método anterior de formatação de string que ainda tem lugar hoje é o str.format()
. Para usá-lo, o senhor precisa inserir placeholders de campo de substituição na string onde deseja que os dados estejam. Em seguida, o senhor adiciona especificadores de formato aos espaços reservados para especificar como deseja que os dados apareçam. Por fim, o senhor passa os dados a serem inseridos na cadeia de caracteres como parâmetros para .format()
na mesma ordem que os placeholders.
O exemplo de código abaixo ilustra tudo isso:
Como o senhor pode ver, os placeholders usam cada um dos parâmetros passados para a função .format()
em ordem. Embora isso não seja tão legível quanto a alternativa f-string, o senhor ainda usa a mesma mini-linguagem para definir a formatação.
Também é possível passar valores para .format()
por palavra-chave. Quando o senhor adicionar essas palavras-chave aos campos de substituição da string, os valores correspondentes serão inseridos na string quando ela for exibida:
Nessa versão, o senhor passa parâmetros para .format()
por palavra-chave. Observe que a ordem dos parâmetros que o senhor passa não importa. Desde que as palavras-chave correspondam aos espaços reservados dentro das chaves nos especificadores de formato, o Python as substitui de acordo.
Em vez de passar os valores individuais como parâmetros de palavra-chave, o senhor pode seguir um padrão comum que envolve um dicionário Python:
Em seu código, o senhor usou o operador de desempacotamento (**
) para passar o dicionário data
para .format()
. Isso passa cada uma das chaves do dicionário como um parâmetro nomeado separado e cada um de seus valores como o valor do parâmetro nomeado.
Como o senhor pode ver, esse código está se aproximando da sintaxe usada com f-strings. O senhor poderia levar isso para o próximo nível e criar seu próprio modelo de formatação de números:
Desta vez, o senhor constrói o especificador de formato passando o número a ser formatado junto com um conjunto de parâmetros nomeados para .format()
. Esses parâmetros são aplicados ao seu num
que é então usado para formatar seu número.
Quando o senhor usa .format()
também é possível definir o especificador de formato dinamicamente no tempo de execução. Suponha que o senhor tenha várias palavras que deseja preencher com uma largura de quatro caracteres maior que o comprimento. O código abaixo mostra como o senhor pode fazer isso:
Mais uma vez, o senhor constrói o especificador de formato para incluir o nome dos parâmetros que receberá de .format()
. A palavra a ser formatada é atribuída ao word
, enquanto a largura calculada dinamicamente é atribuída a length
. O senhor consegue isso aninhando o campo de substituição de precisão {length}
dentro do especificador de formato. O asterisco (*
) define o caractere de preenchimento a ser usado, enquanto o acento circunflexo (^
) garante que a saída seja centralizada.
O símbolo padded_words
é criada usando um compreensão de lista. O .split()
é chamado no conteúdo do text
que separa a string original por seus caracteres de espaço e produz uma lista contendo suas três palavras. O método for
itera sobre cada uma delas e as passa para o .format()
.
Quando cada word
é recebido pelo .format()
, seu valor é atribuído à variável word
e seu comprimento mais quatro caracteres é atribuído à variável length
. Essas variáveis são então aplicadas ao especificador de formato para produzir a versão formatada em padded_words
.
Pegue seu boné de pensamento novamente. É hora de enfrentar mais desafios.
Tarefa 8: No exemplo anterior, o senhor produziu esta lista de cadeias de caracteres ['**Python**', '**is**', '**cool**']
com o código baseado no str.format()
. Veja se o senhor pode reescrever isso usando a sintaxe f-string.
Tarefa 9: Comece com o numbers = [1234.56789, 123.456789, 12.3456789, 1.23456789]
e veja se o senhor pode escrever um especificador de formato para produzir uma segunda lista chamada numbers_formatted
que contém ["1,234.5679", "123.457", "12.35", "1.2"]
.
Como o senhor pode ver, cada número é arredondado de modo que haja o mesmo número de dígitos antes do ponto decimal e depois dele.
Os senhores encontrarão possíveis soluções nos materiais para download que acompanham este tutorial.
O senhor certamente trabalhou muito neste tutorial. Agora é hora de tirar férias.
Formatação de números para uso internacional
Se alguma vez o senhor precisar escrever um código que será usado internacionalmente, deverá certificar-se de que os números sejam formatados usando o locale do país em que estão sendo executados. Isso garantirá que seus números e datas sejam formatados de acordo com as convenções locais para que sejam compreendidos corretamente. Para dar suporte à internacionalização em seu código, o senhor pode usar a função locale
do Python.
O locale
permite que o senhor especifique formatos padrão, como o separador de milhares, o símbolo de moeda e assim por diante. Normalmente, não é necessário definir isso explicitamente no computador porque as configurações do sistema operacional são usadas por padrão. No entanto, se quiser ter certeza de que seu código será executado usando uma localidade específica, o senhor pode defini-la explicitamente.
É possível encontrar o locale que seu computador está usando no momento com o comando locale.getlocale()
:
O computador usado para executar esse código está usando o English_United Kingdom
locale. O 1252
é a codificação de caracteres usada pelo Windows ao codificar cada caractere inglês. Cada símbolo ocupa um único byte na memória. Execute o código você mesmo para ver os resultados de sua localidade.
Se quiser formatar os números de acordo com a localidade de seu computador, use o comando n
em seu especificador de formato:
Como o senhor pode ver, o n
em um computador que usa o locale ('English_United Kingdom', '1252')
é equivalente a usar .2f
como especificador de formato. Essa localidade determina que o ponto (.
) é usado como o ponto decimal, enquanto o sinal negativo é colocado à esquerda do número.
Para realmente apreciar o que o n
o senhor precisa executá-lo em uma variedade de locais. Felizmente, o locale
fornece um módulo setlocale()
que permite que o senhor faça isso. Desde que seu sistema operacional ofereça suporte às localidades de seu interesse, é possível alterar a forma como os números são exibidos:
O senhor criou uma lista de tuplas, cada uma contendo o nome de um país e uma localidade. Cada valor de localidade está no formato "language_territory.codeset"
. Portanto, "en_US.UTF-8"
especifica que o inglês dos Estados Unidos é usado e cada caractere é codificado com o UTF-8
padrão.
O senhor for
itera através de cada tupla em sample_locales
e a passa para o set_locale()
da função locale
da função. Isso define a localidade em seu computador. O senhor também define o parâmetro category
para LC_ALL
para garantir que a localidade seja aplicada a todas as categorias, inclusive números, datas e moedas. Por fim, o senhor intercepta o nome do locale retornado pela função para evitar que ele seja impresso pelo seu REPL.
Quando o computador tiver uma nova localidade definida, a função print()
mostra ao senhor como cada configuração afeta a exibição de números positivos e negativos em cada um dos países da amostra. Mais uma vez, tudo é arredondado para duas casas decimais.
Observação: O senhor deve ter notado que os números da localidade do Reino Unido agora têm separadores. Isso ocorre porque o senhor definiu a localidade como en_GB.UTF-8
do padrão usado pelo Microsoft Windows.
Se precisar de mais controle sobre a formatação da saída numérica, locale
fornece um format_string()
que usa códigos especificadores de formato semelhantes aos que o senhor aprendeu anteriormente:
Aqui, o senhor exibiu cada número usando notação científica em sua forma local. Para fazer isso, o senhor passou f="%10.2e"
para format_string()
. Ao usar essa função, o senhor deve preceder o formato com um símbolo de operador de formatação de string (%
). O senhor também define o grouping
para True
para garantir que os separadores de milhares foram aplicados.
Observação: Quando o senhor define um formato usando o formulário "%10.2e"
, o senhor está usando uma linguagem de formatação semelhante, mas não idêntica, à linguagem usada pelos especificadores de formato mais modernos. Desta vez, o senhor está usando o estilo antigo formatação de string no estilo printf.
Se quiser exibir moedas, o senhor pode usar o locale.currency()
:
Aqui, o senhor pode ver como as diferentes moedas são exibidas em cada um dos países da amostra. O senhor usou a função val
e grouping
parâmetros em currency()
da mesma forma que o senhor fez em format_string()
anteriormente.
É isso, o senhor terminou. Agora, o senhor tem uma sólida compreensão das principais maneiras pelas quais o Python permite arredondar números dentro de cadeias de caracteres.
Conclusão
Neste tutorial, o senhor cobriu uma grande quantidade de assuntos que, esperamos, foram interessantes e um pouco desafiadores. Agora o senhor sabe como usar a minilinguagem de especificação de formato do Python para arredondar e exibir valores flutuantes e Decimal
objetos de forma padrão.
O senhor também sabe como lidar com números científicos e complexos. O senhor abordou algumas das formas mais antigas de arredondar números dentro de strings e viu como a sintaxe f-string é revolucionária. O senhor até aprendeu a formatar números dentro de strings internacionalmente.
Agora que o senhor já fez um exercício completo de formatação de números, deve experimentar mais e considerar a possibilidade de se aprofundar nas f-strings e na minilinguagem de especificação de formato que as suporta. Ainda há muito mais para o senhor aprender.
Parabéns por ter concluído este tutorial e que todas as suas strings sejam perfeitas.
Faça o teste: Teste seus conhecimentos com o nosso teste interativo “Format Floats Within F-Strings”. Após a conclusão, o senhor receberá uma pontuação para que possa acompanhar o progresso do seu aprendizado ao longo do tempo:
Questionário interativo
Formatar flutuadores em strings F
Neste teste, o senhor testará sua compreensão de como formatar números flutuantes dentro de strings f em Python. Esse conhecimento permitirá que o senhor controle a precisão e a aparência dos números de ponto flutuante quando os incorporar em cadeias formatadas.