Strings
Índices, fatias, imutabilidade, métodos de texto e processamento carácter a carácter.
Uma string guarda uma sequência ordenada de caracteres. Em "programar", o primeiro pedido consulta a primeira letra por posição, enquanto o segundo extrai "prog" por intervalo de posições.
Índices e limites
Em s = "programar", os índices vão de 0 a 8. s[0] vale "p" e s[8] vale "r". Os índices negativos contam a partir do fim: s[-1] é o último carácter. Uma string vazia não tem nenhum índice válido.
| Carácter | p | r | o | g | r | a | m | a | r |
|---|---|---|---|---|---|---|---|---|---|
| Índice | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| Índice negativo | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
len(s) vale 9. s[len(s)] causa IndexError, porque o último índice é len(s) - 1. Uma iteração for caractere in s percorre os caracteres sem exigir contas com índices.
Fatias
s[inicio:fim:passo] extrai uma sequência, incluindo inicio e excluindo fim. O passo por defeito é 1. s[0:4] vale "prog"; s[4:] vale "ramar"; s[::2] vale "pormr". s[::-1] inverte a string.
Omitir um limite usa o extremo adequado ao passo. Uma fatia tolera limites fora da sequência: s[:100] dá a string inteira. Isto difere da indexação, que exige uma posição existente. Um passo zero causa ValueError.
Texto é imutável
Não podes executar s[0] = "P". Para alterar o primeiro carácter, constrói outra string com "P" + s[1:]. Métodos como upper, lower e replace também devolvem novas strings. Se ignoras o resultado de s.upper(), o nome s continua associado ao texto original.
texto = " Ana;Bruno;Ana "
campos = texto.strip().split(";")
print(campos)
print(" / ".join(campos))
print(texto)Executa o código para ver a saída e os gráficos.
Um método é uma operação chamada através de um objeto: texto.strip() aplica strip a texto. Neste exemplo, o resultado de strip é outra string, e split trabalha sobre esse texto novo.
strip produz "Ana;Bruno;Ana"; depois, split devolve ["Ana", "Bruno", "Ana"], uma lista com três strings por ordem. A lição de tuplos e listas desenvolve essa estrutura; aqui as listas guardam apenas os campos separados.
| Passo | Resultado |
|---|---|
texto.strip() | "Ana;Bruno;Ana" |
.split(";") | ["Ana", "Bruno", "Ana"] |
" / ".join(...) | "Ana / Bruno / Ana" |
strip() retira espaço das pontas, porque só olha para os extremos. split(";") conserva campos vazios interiores: "a;;b".split(";") devolve ["a", "", "b"]. Sem argumento, split() agrupa espaços consecutivos. O último print conserva os espaços do texto inicial porque nenhuma operação o alterou.
Procurar e contar
trecho in texto testa pertença. texto.find(trecho) devolve o índice da primeira ocorrência ou -1; texto.index(trecho) lança ValueError se não houver ocorrência.
count conta ocorrências sem sobreposição. "aaaa".count("aa") vale 2. startswith e endswith verificam as pontas. isalpha e isdigit testam categorias de caracteres, mas aceitam caracteres Unicode além das letras e dígitos ASCII.
Construir uma transformação
Queremos conservar apenas letras e convertê-las em minúsculas: em "FP 2026: Olá!", isso seleciona F, P, O, l e á para produzir "fpolá". O algoritmo decide para cada carácter se pertence ao resultado e depois acrescenta a sua forma minúscula.
def apenas_letras(texto):
resultado = ""
for caractere in texto:
if caractere.isalpha():
resultado += caractere.lower()
return resultado
print(apenas_letras("FP 2026: Olá!"))
print(apenas_letras("123!?"))Executa o código para ver a saída e os gráficos.
A saída é fpolá e uma linha vazia; á permanece porque é uma letra. Depois de cada iteração, resultado contém as letras já visitadas, na ordem original e em minúsculas, e o algoritmo termina depois de percorrer o texto inteiro.
As concatenações constroem strings sucessivamente maiores. Para reunir muitas partes, podes guardá-las numa lista e usar "".join(partes). A condição de seleção e a ordem dos caracteres mantêm-se; muda a forma de construir o resultado.
Comparar palavras e formatar resultados
Strings comparam-se lexicograficamente, carácter a carácter, segundo os valores Unicode. Não confundas essa ordem com uma ordenação linguística portuguesa. "Z" < "a" é verdadeiro, e maiúsculas e minúsculas diferem.
Uma f-string calcula as expressões entre chavetas: f"{3 / 2:.2f}" vale "1.50". Para escrever uma chaveta literal, duplica-a. \n representa uma mudança de linha; \t, uma tabulação; \\, uma barra invertida. A string "a\nb" contém três caracteres, não quatro.
Exercícios
Transformar um nome completo
Define nome_formal(nome): recebe uma string com pelo menos dois nomes separados
por espaços e devolve o último nome, uma vírgula e as iniciais dos anteriores.
Cada inicial é o primeiro carácter do respetivo nome, seguido de ponto; separa
as iniciais com um espaço. Conserva as maiúsculas e minúsculas recebidas.
Ignora espaços adicionais. Não há partículas com tratamento especial.
Por exemplo, "Ana Maria Silva" deve produzir "Silva, A. M.".
def nome_formal(nome):
return ""Verifica o código para comparar o resultado com os testes.
Testes
Vários nomes
Código do testeprint(nome_formal("Ana Maria Silva"))Esperado:Silva, A. M.
Espaços nas pontas e entre nomes
Código do testeprint(nome_formal(" Bruno Costa "))Esperado:Costa, B.
Unicode e dois nomes
Código do testeprint(nome_formal("Álvaro Sá"))Esperado:Sá, Á.
print(nome_formal("Ana Maria Silva"))Silva, A. M.
print(nome_formal(" Bruno Costa "))Costa, B.
print(nome_formal("Álvaro Sá"))Sá, Á.
Pista
split() e distingue o último campo dos anteriores.Solução
split() agrupa espaços consecutivos. partes[-1] é o último nome e
partes[:-1] contém os nomes que fornecem iniciais. Como há pelo menos dois
nomes, cada um destes campos existe e não está vazio.
def nome_formal(nome):
partes = nome.split()
iniciais = []
for parte in partes[:-1]:
iniciais.append(parte[0] + ".")
return partes[-1] + ", " + " ".join(iniciais)Para Ana Maria Silva, as iniciais são ["A.", "M."], que join reúne em
"A. M.". O último nome conserva-se inteiro. A função constrói texto novo;
não altera a string recebida.
Prever fatias
Para s = “abcdef”, escreve os resultados de
s[1:5:2], s[::-1] e s[20:]. Compara o
último caso com s[6], explicando se devolve um valor ou lança
uma exceção.
Pista
Mais uma pista
Solução
Confere a tua resposta:
- Obtive bd.
- Obtive fedcba.
- Reconheci uma string vazia sem exceção.
- Distingui o IndexError de s[6] dos limites ajustados nas fatias.
Erros frequentes
Contar ocorrências
Quanto vale “aaaaa”.count(“aa”)?
Pista
Mais uma pista
Solução
Erros frequentes
Testar uma procura
Para texto = “Python”, qual condição verifica corretamente a
presença de “Py”?
False.Esta condição testa a ausência.Testa pertença e devolve True.Pista
Mais uma pista
Solução
“Py” in texto testa a pergunta diretamente. Também seria
correto texto.find(“Py”) != -1.
bool(texto.find("Py")). find devolve 0, que se converte emFalse.texto.find("Py") == -1. Esta condição testa a ausência."Py" in texto. Testa pertença e devolveTrue.
Erros frequentes
Usar if texto.find(…) e inverter os casos encontrado no
início e ausente.
Conservar só dígitos ASCII
Define digitos_ascii(texto): devolve uma string com apenas os dígitos de “0”
até “9”, pela ordem original. Para “A3٢B5”, devolve “35”. O carácter ٢ é um
dígito Unicode, mas não pertence ao intervalo ASCII pedido.
def digitos_ascii(texto):
return ""Verifica o código para comparar o resultado com os testes.
Testes
Distinguir Unicode de ASCII
Código do testeprint(repr(digitos_ascii("A3٢B5")))Esperado:'35'
Sem dígitos
Código do testeprint(repr(digitos_ascii("abc")))Esperado:''
Texto vazio
Código do testeprint(repr(digitos_ascii("")))Esperado:''
Ordem, extremos e repetições
Código do testeprint(repr(digitos_ascii("90-1 009")))Esperado:'901009'
print(repr(digitos_ascii("A3٢B5")))'35'
print(repr(digitos_ascii("abc")))''
print(repr(digitos_ascii("")))''
print(repr(digitos_ascii("90-1 009")))'901009'
Pista
Decide para cada carácter se pertence ao resultado.
Mais uma pista
A condição “0” <= caractere <= “9” aceita só os dez dígitos pedidos.
Solução
A string começa vazia. Cada carácter aceite é acrescentado no fim,
conservando a ordem e as repetições. isdigit() sozinho também aceita ٢. Nos
testes, repr mostra as aspas para tornar a string vazia visível.
def digitos_ascii(texto):
resultado = ""
for caractere in texto:
if "0" <= caractere <= "9":
resultado += caractere
return resultadoErros frequentes
Aceitar todos os dígitos Unicode, ordenar os caracteres ou eliminar repetições.