Strings são um dos tipos de dados mais fundamentais em Python. Elas representam sequências de caracteres e são usadas para armazenar e manipular texto. Nesta aula, vamos explorar como criar strings, acessar caracteres individuais, fatiar partes de uma string, utilizar métodos essenciais para manipulação e formatar strings de maneira elegante usando f-strings. Ao final, você terá uma base sólida para lidar com texto em seus programas.

Vamos começar com a criação de strings e depois avançar para tópicos mais complexos, sempre com exemplos práticos para facilitar o entendimento.

Criação

Em Python, strings podem ser criadas de várias maneiras. A forma mais comum é usar aspas simples ('...') ou duplas ("..."). Para strings que ocupam múltiplas linhas, usamos aspas triplas ('''...''' ou """..."""). A escolha entre aspas simples e duplas geralmente depende do conteúdo da string: se a string contém aspas simples, é conveniente usar aspas duplas para delimitá-la, e vice-versa.

Além disso, Python oferece funções como str() para converter outros tipos de dados em strings. Aqui estão exemplos de criação:

# Usando aspas simples
nome = 'Alice'

# Usando aspas duplas
frase = "Olá, mundo!"

# Usando aspas triplas para múltiplas linhas
paragrafo = """Esta é uma string
que ocupa várias linhas."""

# Convertendo outros tipos para string
idade = 30
idade_str = str(idade)

print(nome)
print(frase)
print(paragrafo)
print(idade_str)

É importante notar que strings em Python são imutáveis: uma vez criadas, não podem ser alteradas. Qualquer operação que pareça modificar uma string na verdade cria uma nova string. Isso é uma característica de design que traz eficiência e segurança ao código.

Indexação e fatiamento

Strings são sequências, portanto podemos acessar caracteres individuais usando índices. Em Python, a indexação começa em 0. Também podemos usar índices negativos para acessar caracteres a partir do final da string: -1 é o último caractere, -2 o penúltimo, e assim por diante.

Fatiamento (slicing) permite extrair substrings especificando um intervalo de índices no formato [início:fim] (o fim é exclusivo). Se omitirmos o início, Python assume 0; se omitirmos o fim, assume o comprimento da string. Também podemos especificar um passo (step) para pular caracteres.

texto = "Python é incrível"

# Acessando caracteres
print(texto[0])    # P
print(texto[-1])   # l

# Fatiamento
print(texto[0:6])   # Python
print(texto[7:])    # é incrível
print(texto[:6])    # Python
print(texto[::2])   # Pto écrvl (pulando de 2 em 2)

# Invertendo a string
print(texto[::-1])  # lévircni é nohtyP

Entender fatiamento é crucial para manipular strings de forma eficiente, como extrair partes de URLs, nomes de arquivos, ou dados formatados. Lembre-se de que os índices podem ser negativos e o passo também, permitindo operações poderosas em uma única linha.

Métodos essenciais

Python fornece uma vasta gama de métodos para strings. Vamos destacar os mais úteis no dia a dia:

  • upper() e lower(): convertem para maiúsculas/minúsculas.
  • strip(): remove espaços em branco das extremidades (também existem lstrip() e rstrip()).
  • replace(): substitui uma substring por outra.
  • split(): divide a string em uma lista com base em um delimitador.
  • join(): junta uma lista de strings em uma única string usando um separador.
  • find() e index(): localizam a posição de uma substring.
  • startswith() e endswith(): verificam prefixo/sufixo.
  • count(): conta ocorrências de uma substring.

Vamos ver exemplos práticos:

mensagem = "  Olá, Mundo!  "

# Limpeza e conversão
print(mensagem.strip())      # "Olá, Mundo!"
print(mensagem.upper())      # "  OLÁ, MUNDO!  "
print(mensagem.lower())      # "  olá, mundo!  "

# Substituição
print(mensagem.replace("Mundo", "Python"))  # "  Olá, Python!  "

# Divisão e junção
palavras = mensagem.split(",")
print(palavras)  # ['  Olá', ' Mundo!  ']

lista = ["Python", "é", "incrível"]
print(" ".join(lista))  # "Python é incrível"

# Busca e contagem
frase = "O rato roeu a roupa do rei de Roma"
print(frase.find("roeu"))      # 7
print(frase.startswith("O"))   # True
print(frase.endswith("Roma"))  # True
print(frase.count("r"))        # 6 (inclui maiúsculas? não, é case-sensitive)

Dominar esses métodos permitirá que você manipule textos facilmente, desde validação de entradas até processamento de dados.

f-strings

As f-strings (format strings) foram introduzidas no Python 3.6 e revolucionaram a formatação de strings. Elas permitem incorporar expressões Python diretamente dentro de strings, prefixando a string com f ou F. As variáveis ou expressões são colocadas entre chaves {}.

Além de simples substituição, f-strings suportam especificadores de formato avançados, como controle de precisão, alinhamento, preenchimento e conversão para diferentes bases.

nome = "Alice"
idade = 30

# Uso básico
print(f"Meu nome é {nome} e eu tenho {idade} anos.")

# Expressões
print(f"Em 5 anos, terei {idade + 5} anos.")

# Formatação de números
pi = 3.14159265
print(f"Valor de pi: {pi:.2f}")  # dupla precisão, 2 casas decimais

# Alinhamento e preenchimento
print(f"{nome:>10}")  # alinha à direita em 10 espaços
print(f"{nome:<10}")  # alinha à esquerda
print(f"{nome:^10}")  # centraliza

# Base numérica
numero = 255
print(f"Em hexadecimal: {numero:#x}")  # 0xff
print(f"Em binário: {numero:b}")       # 11111111

As f-strings são a forma recomendada de formatação em Python moderno, pois são mais legíveis e eficientes do que as antigas % ou str.format(). Sempre que precisar combinar texto com variáveis, prefira f-strings.

Boas práticas e observações

Ao trabalhar com strings, siga estas boas práticas:

  • Use f-strings para formatação, a menos que precise de compatibilidade com versões anteriores ao Python 3.6.
  • Para strings longas ou com muitas concatenações, evite usar + repetidamente; prefira join() ou f-strings.
  • Lembre-se de que strings são imutáveis; operações que parecem modificar strings criam novas, o que pode impactar desempenho em loops grandes.
  • Use métodos como strip() para limpar entradas do usuário.
  • Quando precisar de expressões regulares, combine métodos de strings com o módulo re se necessário.

Com esses conceitos, você está pronto para lidar com textos em Python de forma eficiente e elegante.

Exercícios

  1. Crie uma string com seu nome completo e imprima apenas o primeiro nome e o sobrenome usando fatiamento.

    ✓ Resposta:
    nome_completo = "João da Silva"
    # Supondo que o nome tenha apenas dois nomes
    primeiro = nome_completo.split()[0]
    sobrenome = nome_completo.split()[-1]
    print(primeiro, sobrenome)
    # Ou usando fatiamento se soubermos as posições:
    # primeiro = nome_completo[:4]  # "João"
    # sobrenome = nome_completo[8:] # "Silva"
  2. Dada a string "Python é uma linguagem poderosa", conte quantas vezes a letra "a" aparece (ignorando maiúsculas/minúsculas) e imprima o resultado.

    ✓ Resposta:
    frase = "Python é uma linguagem poderosa"
    # Converter para minúsculas e contar
    contagem = frase.lower().count('a')
    print(contagem)  # Saída: 4
  3. Escreva uma função que receba uma string e retorne a mesma invertida. Teste com "Python".

    ✓ Resposta:
    def inverter_string(s):
        return s[::-1]
    
    print(inverter_string("Python"))  # nohtyP
  4. Formate a seguinte variável para exibir um número com duas casas decimais e separador de milhar: populacao = 12345678 (exiba como 12.345.678,00? Não, use vírgula para milhar e ponto para decimal? Vamos usar padrão brasileiro: 12.345.678).

    ✓ Resposta:
    populacao = 12345678
    print(f"{populacao:,.2f}")  # 12.345.678,00? Na verdade, isso usa ponto como separador de milhar e vírgula para decimal. Para formato brasileiro, precisamos de mais trabalho.
    # Uma solução simples:
    print(f"{populacao:,}".replace(",", "."))  # 12.345.678
    # Para duas casas decimais com vírgula:
    print(f"{populacao:,.2f}".replace(",", "X").replace(".", ",").replace("X", "."))  # 12.345.678,00
  5. Extraia o domínio de um email (parte após '@') usando métodos de strings. Exemplo: "usuario@exemplo.com" deve retornar "exemplo.com".

    ✓ Resposta:
    email = "usuario@exemplo.com"
    dominio = email.split('@')[1]
    print(dominio)  # exemplo.com

Referências