Pular para conteúdo

11. Texto: índice, fatia e os métodos prontos

Nesta aula

Ideia central: desde a Unidade 1 você lê texto com input() e imprime texto com print() — mas sempre como um bloco fechado, lido e impresso inteiro. Esta aula abre esse bloco: cada posição tem um número, um pedaço pode ser recortado, e boa parte do que se faz com texto já vem pronta num método, sem precisar de laço nenhum.

Ao fim você vai conseguir: pegar um caractere ou um pedaço de um texto pelo índice; usar len, upper, lower, strip, split e in; montar uma mensagem nova com f-string; e reconhecer a armadilha central da unidade — um método que roda, não dá erro, e não muda nada.

A ferramenta muda esta semana

A partir de hoje o trabalho sai do OnlineGDB e passa para o Google Colab. O assunto desta aula é o mais leve do semestre de propósito: a única coisa nova de verdade é a ferramenta, não a lógica.

Antes de abrir a Lista 11, leia Google Colab — em especial a parte sobre a ordem de execução das células, que é a diferença que mais confunde quem vem do OnlineGDB.

Texto também tem posição

Um texto é uma sequência de caracteres, e cada um mora numa posição — o índice — que começa em zero, exatamente como o índice de uma lista. texto[i] pega um caractere; texto[i:j] recorta um pedaço, do índice i até o j sem incluir o j.

plano = "FIBRA300"

print(plano[0])
print(plano[5:8])
print(len(plano))
F
300
8

plano[0] é o primeiro caractere; plano[5:8] é o pedaço do índice 5 ao 7; len(plano) conta quantos caracteres o texto tem — a mesma função que já contava itens de lista.

💡 Pense assim: a régua embaixo da palavra

Escreva o texto e, embaixo de cada letra, o número da posição: F-0, I-1, B-2... texto[i] é "o que está embaixo do número i"; texto[i:j] é "tudo entre a marca i e a marca j, parando antes dela".

Um índice que não existe é um erro que o Python denuncia, igual ao de lista da Unidade 4: IndexError: string index out of range.

Maiúsculas, minúsculas e espaço sobrando

cliente = "Ana Souza"

print(cliente.upper())
print(cliente.lower())
ANA SOUZA
ana souza

.upper() devolve o texto todo em maiúsculas; .lower(), todo em minúsculas. Repare no (): são métodos, chamados com parênteses depois do nome, e não mudam o texto — devolvem um texto novo.

A armadilha: o método devolve, não muda

Isso vale para todo método de texto, e é o assunto central desta unidade. strip() remove os espaços do início e do fim — útil sempre que um dado vem digitado ou colado, com espaço sobrando sem ninguém notar.

# A armadilha desta unidade: chamar o metodo sem guardar o resultado.
nome = "  Ana Souza  "

nome.strip()
print(f"Errado: '{nome}'")

nome = nome.strip()
print(f"Certo : '{nome}'")
Errado: '  Ana Souza  '
Certo : 'Ana Souza'

nome.strip(), sozinho na linha, calcula o texto limpo e joga o resultado fora. nome continua exatamente como estava — sujo. O programa não travou, não imprimiu nada estranho, não avisou nada. Só ignorou o que você pediu.

Texto é imutável: nenhum método muda o original

strip, upper, lower — e todo método de texto que você vai ver este semestre — sempre devolvem um texto novo. Se você quer guardar o resultado, tem de atribuir de volta, geralmente na mesma variável:

nome = nome.strip()

Sem o nome = na frente, o .strip() calculado não vai a lugar nenhum.

Compare com o que acontece se você tentar trocar um caractere direto, pelo índice:

# Texto e imutavel: nao da para trocar um caractere no lugar.
plano = "FIBRA300"
plano[0] = "G"
TypeError: 'str' object does not support item assignment

TypeError: 'str' object does not support item assignment — "objeto texto não aceita atribuição por posição". Este erro para o programa na hora.

Código O que acontece
texto[0] = "X" TypeError, o programa para imediatamente
texto.strip() sem atribuir nada — nenhum erro, e o texto original continua do jeito que estava

Os dois nascem da mesma regra — texto não muda no lugar —, mas só um deles avisa. É por isso que o segundo é o perigoso: ele passa despercebido até alguém notar que o espaço, ou a letra maiúscula, continuam lá.

split: quebrar o texto numa lista

nome_completo = "Carlos Eduardo Silva"

partes = nome_completo.split(" ")
print(partes)
print(len(partes))
print(partes[0])
['Carlos', 'Eduardo', 'Silva']
3
Carlos

nome_completo.split(" ") corta o texto a cada espaço e devolve uma lista — a mesma lista da Unidade 4, com len e índice funcionando exatamente igual. partes[0] é o primeiro pedaço, não o texto inteiro.

in: um pedaço está lá dentro?

mensagem = "Aguardando confirmacao do pagamento"

print("pagamento" in mensagem)
print("boleto" in mensagem)
True
False

"pagamento" in mensagem devolve True ou False — o mesmo booleano da Unidade 2 — e serve direto num if. Maiúscula e minúscula contam: "Pagamento" in mensagem teria dado False na mesma frase.

Percorrendo letra a letra: for letra in texto

Você já percorreu uma lista com for. Um texto funciona igual — e cada volta dá uma letra:

# Um texto se percorre como uma lista: for letra in texto da uma letra por volta.
frase = "Ana Oliveira"

vogais = 0
for letra in frase.lower():
    if letra in "aeiou":
        vogais = vogais + 1

print("Letras no total:", len(frase))
print("Vogais:", vogais)
Letras no total: 12
Vogais: 7

É o padrão "contar sob condição" da Unidade 4, aplicado a texto: contador em zero antes do laço, if dentro, + 1 quando o teste dá certo. A única novidade é o que está sendo percorrido.

O .lower() não é enfeite

O mesmo programa sem o .lower() responde outra coisa:

# O mesmo programa, sem o .lower(): as maiusculas escapam da contagem.
frase = "Ana Oliveira"

vogais = 0
for letra in frase:
    if letra in "aeiou":
        vogais = vogais + 1

print("Vogais contadas:", vogais)
Vogais contadas: 5

Sete vogais contra cinco. O A de Ana e o O de Oliveira não estão em "aeiou" — são outros caracteres, tão diferentes de a e o quanto x é.

E repare: o segundo programa não dá erro. Ele roda, não reclama e entrega cinco. Você só descobre olhando a resposta e desconfiando dela.

💡 Pense assim: soletrar em voz alta

for palavra in frase.split() lê a frase palavra por palavra. for letra in frase soletra. Escolha conforme o que você precisa contar.

Montando um texto novo com f-string

Nada aqui é novo — é a f-string da Unidade 1, agora combinada com um método dentro das chaves:

nome_completo = input("Nome completo do cliente: ")

partes = nome_completo.split(" ")
primeiro_nome = partes[0]

print(f"Ola, {primeiro_nome.upper()}! Seja bem-vindo.")
Nome completo do cliente: Ola, ANA! Seja bem-vindo.

Repare que Nome completo do cliente: e a resposta ficam na mesma linha: é o convite do input(), que não pula linha, seguido do que o programa imprime depois. partes[0] pega o primeiro nome; .upper() devolve ele em maiúsculas; a f-string junta tudo numa mensagem só — sem que nome_completo em si tenha mudado.

Erros comuns deste capítulo

Mensagem ou sintoma Causa provável
TypeError: 'str' object does not support item assignment tentou trocar um caractere direto, texto[0] = ... — construa um texto novo em vez disso
o texto "sujo" continua sujo depois do .strip() esqueceu o texto = na frente: texto.strip() sozinho não muda nada
.upper() ou .lower() "não fizeram nada" mesmo motivo — o método devolve um texto novo, não altera o original
IndexError: string index out of range pediu uma posição que não existe — o último índice válido é len(texto) - 1
split devolveu uma lista com um item só o separador não aparece no texto, ou está escrito diferente do combinado
in sempre dá False, mesmo com o pedaço "certo" maiúscula e minúscula contam; normalize com .lower() dos dois lados antes de comparar

Resumo

  • texto[i] pega um caractere; texto[i:j] recorta um pedaço, do índice i ao j sem incluir o j. len(texto) conta os caracteres.
  • upper, lower e strip devolvem um texto novo — nunca mudam o original. Guardar o resultado é sempre texto = texto.metodo().
  • Texto é imutável. texto[0] = "X" dá TypeError na hora — o erro que se denuncia. Chamar um método sem atribuir o resultado não dá erro nenhum — o erro desta unidade que não dá erro.
  • split(separador) devolve uma lista de pedaços do texto.
  • x in texto devolve True ou False, conforme x aparece ou não.
  • F-string continua sendo o jeito de montar uma mensagem nova, e pode chamar um método dentro das chaves.

Para praticar

Lista 11 · Texto.

Nesta lista você resolve pela primeira vez no Google Colab. O assunto é o mesmo que acabou de ler — a ferramenta é que é nova.