Strings avançado
Aula avançada sobre strings em Python, abordando formatação, imutabilidade, encoding e operações comuns. Inclui exemplos práticos e exercícios com respostas.
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.14O 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") # UnicodeDecodeErrorPara 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")) # TruePara 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
- Documentação oficial: Text Sequence Type - str
- Documentação do módulo string
- Tutorial: Formatação de strings
- Unicode HOWTO
- Real Python: Strings in Python
- W3Schools: Python Strings
Exercícios
Crie uma variável
nomecom seu nome e outraidadecom 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.")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:]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!Dada a lista
palavras = ["Python", "é", "legal"], usejoinpara criar a string "Python é legal" com espaços entre as palavras.✓ Resposta:palavras = ["Python", "é", "legal"] frase = " ".join(palavras) print(frase) # Python é legalEscreva 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)