Strings

Índices, fatias, imutabilidade, métodos de texto e processamento carácter a carácter.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

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ácterprogramar
Índice012345678
Í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.

Normalizar e separar texto
texto = "  Ana;Bruno;Ana  "
campos = texto.strip().split(";")
print(campos)
print(" / ".join(campos))
print(texto)
Resultado

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.

PassoResultado
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.

Conservar letras
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!?"))
Resultado

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.".

Python
def nome_formal(nome):
    return ""
Testes e resultado

Verifica o código para comparar o resultado com os testes.

Testes
  1. Vários nomes
    Código do teste
    print(nome_formal("Ana Maria Silva"))
    Esperado:
    Silva, A. M.
  2. Espaços nas pontas e entre nomes
    Código do teste
    print(nome_formal("  Bruno   Costa  "))
    Esperado:
    Costa, B.
  3. Unicode e dois nomes
    Código do teste
    print(nome_formal("Álvaro Sá"))
    Esperado:
    Sá, Á.

Pista
Separa o texto com 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.

Voltar à explicação
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
A primeira fatia visita índices 1 e 3.
Mais uma pista
Uma fatia com início além do fim e passo positivo pode ser vazia.
Solução
Os resultados são "bd", "fedcba" e "". O índice 5 é o limite excluído; o passo -1 percorre a string ao contrário; a última fatia não causa IndexError. s[6] lança IndexError: o último índice é 5. A indexação exige uma posição existente; a fatia ajusta os limites à sequência.

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

Incluir o limite final ou aplicar às fatias a regra de falha da indexação.
Voltar à explicação
Contar ocorrências

Quanto vale “aaaaa”.count(“aa”)?

Pista
count não conta ocorrências sobrepostas.
Mais uma pista
Depois dos dois primeiros caracteres, conta sobre o texto ainda não consumido.
Solução
Vale 2. Duas ocorrências de dois caracteres ocupam quatro posições; sobra um carácter.

Erros frequentes

Responder 4 por contar todos os índices em que aa poderia começar.
Voltar à explicação
Testar uma procura

Para texto = “Python”, qual condição verifica corretamente a presença de “Py”?

A tua resposta

Pista
find devolve zero quando encontra na primeira posição.
Mais uma pista
Zero é falso numa condição, mas a ocorrência existe.
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 em False.
  • texto.find("Py") == -1. Esta condição testa a ausência.
  • "Py" in texto. Testa pertença e devolve True.

Erros frequentes

Usar if texto.find(…) e inverter os casos encontrado no início e ausente.

Voltar à explicação
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.

Python
def digitos_ascii(texto):
    return ""
Testes e resultado

Verifica o código para comparar o resultado com os testes.

Testes
  1. Distinguir Unicode de ASCII
    Código do teste
    print(repr(digitos_ascii("A3٢B5")))
    Esperado:
    '35'
  2. Sem dígitos
    Código do teste
    print(repr(digitos_ascii("abc")))
    Esperado:
    ''
  3. Texto vazio
    Código do teste
    print(repr(digitos_ascii("")))
    Esperado:
    ''
  4. Ordem, extremos e repetições
    Código do teste
    print(repr(digitos_ascii("90-1 009")))
    Esperado:
    '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 resultado

Erros frequentes

Aceitar todos os dígitos Unicode, ordenar os caracteres ou eliminar repetições.

Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.