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[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¶
.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}'")
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:
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:
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])
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)
"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)
É 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)
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.")
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 índiceiaojsem incluir oj.len(texto)conta os caracteres.upper,lowerestripdevolvem um texto novo — nunca mudam o original. Guardar o resultado é sempretexto = texto.metodo().- Texto é imutável.
texto[0] = "X"dáTypeErrorna 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 textodevolveTrueouFalse, conformexaparece 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¶
Nesta lista você resolve pela primeira vez no Google Colab. O assunto é o mesmo que acabou de ler — a ferramenta é que é nova.