Aprenda a manipular strings utilizando f-strings no Python

Como usar f-strings no Python

Olá Pythonista!

Hoje vamos aprender uma forma de manipular strings de um jeito legível e mais conciso, utilizando f-strings!

F-strings foram introduzidas no Python 3.6 através da PEP 498.

Ao fim desse post, você aprenderá como e porquê utilizar f-strings!

Então faz o cafézinho nosso de cada dia e vamos nessa!

Vá Direto ao Assunto…

Formatação de Strings em Python

Em Python nós não temos muitas formas de formatar strings, graças a um dos Zen’s do Python (não sabe qual? Então já clica aqui pra saber mais).

Antes do Python 3.6, nós tínhamos basicamente duas formas de formatar strings:

  • Utilizando % ou
  • Utilizando str.format(), a partir do Python 3.0.

A partir da versão 3.6 do Python, foi introduzido o conceito de f-strings, que veremos AGORA!

Formatação com f-strings

F-strings foram criados para facilitar nossa vida e vieram para ficar!

Também chamadas de “strings literais formatadas” (formatted string literals), f-strings são strings com a letra f no início e chaves {} para realizar a interpolação de expressões.

As expressões são processadas em tempo de execução e formatadas utilizadas o protocolo __format__. Vamos de exemplo:

1
2
3
nome = 'Python Academy'

print(f"Qual o melhor Blog sobre Python? {nome}!")

E a saída seria:

1
Qual o melhor Blog sobre Python? Python Academy!!!

Utilizando funções

Como f-strings são processadas em tempo de execução, podemos colocar quase todo tipo de código dentro das expressões.

Aqui um outro exemplo, utilizando chamada de função e mais:

1
2
3
nome = 'python academy'

print(f"Qual o melhor Blog sobre Python? {nome.upper() + '!' * 3}")

Sua saída seria:

1
Qual o melhor Blog sobre Python? PYTHON ACADEMY!!!

Ou ainda:

1
2
3
4
5
import math

x = 0.5

print(f'cos({x}) = {math.cos(x)}')

O output seria:

1
cos(0.5) = 0.8775825618903728

Acessando dicionários

Também é possível acessar dicionários dentro de f-strings:

1
2
3
dicionario = dict({'nome': 'Vinícius', 'ocupacao': 'Software Engineer'})

print(f"{dicionario['nome']} é um {dicionario['ocupacao']}")

Seu output seria:

1
Vinícius é um Software Engineer

Strings multi-linha

Também podemos criar f-strings multilinha:

1
2
3
4
5
6
7
8
9
site = 'Python Academy'
titulo = 'f-string no Python'
dificuldade = 'Básico'

print(
  f"Site: {site}\n"
  f"Título: {titulo}\n"
  f"Dificuldade: {dificuldade}"
)

A saída seria a seguinte:

1
2
3
Site: Python Academy
Título: f-string no Python
Dificuldade: Básico

E aí? Tá curtindo nosso material? Que tal fazer parte da nossa lista exclusiva de Pythonistas?

Vamos nessa! :wink:

Método de classe __str__ vs __repr__

Você pode até mesmo utilizar objetos instanciados dentro de f-strings. Por exemplo, caso você tenha a seguinte classe:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Carro:
  def __init__(self, marca, modelo, ano):
    self.marca = marca
    self.modelo = modelo
    self.ano = ano
    
  def __str__(self):
    return f"{self.marca}/{self.modelo} - Ano {self.ano}"

  def __repr__(self):
    return (
      f"Marca: {self.marca}\n"
      f"Modelo: {self.modelo}\n"
      f"Ano: {self.ano}"
    )

Seria possível fazer:

1
2
3
possante = Carro('Ferrari', 'F8 Tributo', '21')

print(f'{possante}')

A saída de código seria:

1
Ferrari/F8 Tributo - Ano 21

A saída padrão é a do método __str__.

Contudo, se quisermos apresentar a representação presente no método __repr__, podemos utilizar flag especial !r.

Veja como:

1
print(f'{possante!r}')

Dessa forma, a saída seria a seguinte:

1
2
3
Marca: Ferrari
Modelo: F8 Tributo
Ano: 21

Utilizando formatadores especiais

A Especificação de Formatação (do inglês “Format Specification” - acesse a documentação aqui) oferece modificadores que podem ser utilizados em conjunto com f-strings.

A especificação é bem extensa e contém diversos componentes, portanto sugiro dar uma olhadinha lá.

Sua forma é a seguinte:

1
{[<nome>][!<conversão>][:<modificador>]}

A parte [:<modificador>] é bem complexa e possui os seguintes campos:

1
:[[<preenchimento>]<alinhamento>][<sinal>][#][0][<comprimento>][<grupo>][.<precisão>][<tipo>]

Cada campo desse possibilita um tipo de modificação na string resultante.

Vamos de exemplo!

Um modificador disponível é o símbolo de porcentagem %. Ele serve para formatar saídas numéricas. Veja a mágica:

1
2
3
4
5
6
valor = 5.5 / 40.0

print(
  f'Resultado original: {valor}\n'
  f'Resultado formatado: {valor:.1%}'
)

Olha a saída:

1
2
Resultado original: 0.1375
Resultado formatado: 13.8%

Explicando:

  • O .1 diz que a string resultante deve ter apenas uma casa decimal;
  • O % multiplica o valor por 100 e inclui o % ao final.

Agora um exemplo maluco:

1
2
3
valor = 255

print(f"'{valor:-^10x}'")

E a saída:

1
'----ff----'

Agora vamos com calma:

  • - é o [<preenchimento>]: é esse caracter que vai preencher os espaços vazios;
  • ^ é o [<alinhamento>]: diz como a string deve ser alinhada. No caso, ^ diz que a string deve ser centralizada.
  • 10 é o [<comprimento>]: diz que a string resultante deve ter 10 caracteres.
  • x é o [<tipo>]: diz que a string deve ser convertida em hexadecimal (portanto ff no resultado).

Um tanto complexo, mas conciso!

Conclusão

Vimos nesse post como é simples utilizar f-strings e como deixa nosso código mais legível!

Agora que você sabe como é simples utilizar f-strings, que tal refatorar aquele monte de string formatada com %? :thinking:

Uma boa né?! :sweat_smile:

E aí, que ver mais do quê por aqui? Comenta aqui embaixo! :point_down:

Até a próxima, Pythonista!

Gostou do conteúdo? Compartilha aí!