Nesta aula, vamos aprofundar o conhecimento sobre strings em Python, explorando tópicos como formatação, imutabilidade, encoding e operações comuns. Strings são um dos tipos mais utilizados em Python, e dominar esses conceitos é essencial para escrever código eficiente e correto.

Vamos começar com a formatação, que permite inserir valores dinâmicos em strings, depois entender por que strings são imutáveis e como isso afeta o desempenho. Em seguida, veremos a diferença entre str e bytes, fundamental para lidar com texto em diferentes codificações. Por fim, revisaremos operações comuns como split, join, replace e busca.

Formatação

A formatação de strings em Python pode ser feita de várias maneiras: usando o operador %, o método str.format() e as f-strings (Python 3.6+). As f-strings são a forma mais moderna e recomendada, pois são mais legíveis e eficientes.

Exemplo com f-strings:

nome = "Alice"
idade = 30
print(f"Meu nome é {nome} e tenho {idade} anos.")
# Saída: Meu nome é Alice e tenho 30 anos.

É possível usar expressões dentro das chaves:

print(f"Daqui a 5 anos terei {idade + 5} anos.")
# Saída: Daqui a 5 anos terei 35 anos.

Para formatar números, use : seguido de especificadores de formato:

pi = 3.1415926535
print(f"Pi com duas casas decimais: {pi:.2f}")
# Saída: Pi com duas casas decimais: 3.14

O método str.format() também é útil, especialmente em versões anteriores ao Python 3.6:

print("Meu nome é {} e tenho {} anos.".format(nome, idade))
# Saída: Meu nome é Alice e tenho 30 anos.

E o operador % (estilo antigo):

print("Meu nome é %s e tenho %d anos." % (nome, idade))
# Saída: Meu nome é Alice e tenho 30 anos.

Imutabilidade

Strings em Python são imutáveis, ou seja, não podem ser alteradas após a criação. Qualquer operação que pareça modificar uma string na verdade cria uma nova string. Isso tem implicações importantes para desempenho e uso de memória.

Exemplo:

s = "hello"
# Tentar alterar um caractere gera erro:
# s[0] = 'H'  # TypeError: 'str' object does not support item assignment
# Para "modificar", criamos uma nova string:
s_nova = 'H' + s[1:]
print(s_nova)  # "Hello"
print(s)       # "hello" (original inalterado)

A imutabilidade torna as strings seguras para uso como chaves em dicionários e em conjuntos, pois seu valor nunca muda. Além disso, permite que Python otimize internamente o armazenamento, como o interning de strings pequenas.

Para concatenar muitas strings, evite usar + em loops, pois cada concatenação cria uma nova string, resultando em O(n²). Prefira usar str.join() ou listas:

# Ineficiente
resultado = ""
for s in lista_de_strings:
    resultado += s

# Eficiente
resultado = "".join(lista_de_strings)

Encoding (str vs bytes)

Em Python, strings (str) representam texto Unicode, enquanto bytes representam dados binários (sequências de bytes). A conversão entre eles é feita através de encoding (codificação), como UTF-8, ASCII, etc.

Para converter uma string em bytes, use o método .encode():

s = "Olá, mundo!"
b = s.encode("utf-8")
print(b)  # b'Ol\xc3\xa1, mundo!'
print(type(b))  # <class 'bytes'>

Para converter bytes de volta para string, use .decode():

s_decod = b.decode("utf-8")
print(s_decod)  # Olá, mundo!

Se a codificação não for especificada, Python usa UTF-8 por padrão. É importante usar a mesma codificação na codificação e decodificação, caso contrário podem ocorrer erros ou caracteres corrompidos.

Exemplo de erro:

b = "Olá".encode("utf-8")
# Tentar decodificar com ASCII (que não suporta acentos):
# b.decode("ascii")  # UnicodeDecodeError

Para evitar erros, é possível usar parâmetros como errors='ignore' ou errors='replace'.

Strings literais em Python 3 são Unicode por padrão, o que facilita o trabalho com texto internacional.

Operações comuns

Python oferece diversos métodos para manipular strings. Vamos revisar alguns dos mais úteis:

  • split(): divide a string em uma lista, usando um separador.
  • join(): une uma lista de strings com um separador.
  • replace(): substitui uma substring por outra.
  • find() e index(): localizam substrings.
  • strip(): remove espaços (ou outros caracteres) do início e fim.
  • upper() e lower(): convertem para maiúsculas/minúsculas.
  • startswith() e endswith(): verificam prefixo/sufixo.

Exemplos:

texto = "  Python é incrível!  "
print(texto.strip())  # "Python é incrível!"
print(texto.split())  # ['Python', 'é', 'incrível!']
print("-".join(["a", "b", "c"]))  # "a-b-c"
print(texto.replace("incrível", "fantástico"))  # "  Python é fantástico!  "
print(texto.find("Python"))  # 2 (posição inicial)
print(texto.upper())  # "  PYTHON É INCRÍVEL!  "
print(texto.startswith("  Py"))  # True

Para busca com padrões mais complexos, use o módulo re (expressões regulares).

Boas práticas

  • Prefira f-strings para formatação (Python 3.6+).
  • Use str.join() para concatenar muitas strings.
  • Ao trabalhar com encoding, especifique sempre a codificação (geralmente UTF-8).
  • Evite modificar strings em loops; crie novas strings quando necessário.

Referências

Exercícios

  1. Crie uma variável nome com seu nome e outra idade com sua idade. Use uma f-string para exibir: "Meu nome é [nome] e tenho [idade] anos."

    ✓ Resposta:
    nome = "João"
    idade = 25
    print(f"Meu nome é {nome} e tenho {idade} anos.")
  2. Explique por que o código abaixo causa erro e como corrigi-lo:

    s = "hello"
    s[0] = "H"

    ✓ Resposta:Strings são imutáveis, não podem ser alteradas. Para corrigir, crie uma nova string: s = "H" + s[1:]
  3. Converta a string "Olá, mundo!" para bytes usando UTF-8 e depois decodifique de volta para string. Mostre o resultado.

    ✓ Resposta:
    s = "Olá, mundo!"
    b = s.encode("utf-8")
    print(b)  # b'Ol\xc3\xa1, mundo!'
    s2 = b.decode("utf-8")
    print(s2)  # Olá, mundo!
  4. Dada a lista palavras = ["Python", "é", "legal"], use join para criar a string "Python é legal" com espaços entre as palavras.

    ✓ Resposta:
    palavras = ["Python", "é", "legal"]
    frase = " ".join(palavras)
    print(frase)  # Python é legal
  5. Escreva um código que receba uma string do usuário e substitua todas as ocorrências de "azul" por "vermelho", e depois imprima o resultado.

    ✓ Resposta:
    texto = input("Digite uma frase: ")
    texto_modificado = texto.replace("azul", "vermelho")
    print(texto_modificado)