O capítulo 3 do livro da cadeira tem vários problemas envolvendo cadeias de caracteres. Vamos apresentar a solução para alguns, todos eles muito semelhantes e que permitem exercitar a operação de
fatiamento (
slicing) e o iterável
range.
O primeiro (
Exercício 3.12) pede-nos para dada uma cadeia e um inteiro positivo mostrar todas as sub-cadeias da cadeia de comprimento igual ao número.
def sub_cadeias(pal, n):
"""
Todas as sub-cadeias de comprimento n.
"""
for i in range(len(pal) - n + 1):
print(pal[i:i + n])
Este exemplo mostra como podemos aceder a um pedaço de uma cadeia usando a operação
cadeia[x:y]. Recordar que o último índice
não conta. Assim, se tivermos, por exemplo cadeia[2:5] acedemos à sequência formada pelos caracteres nas posições 2,3 e 4. Na solução acima,atente no valor do índice mais elevado. Tal acontece devido ao facto das sub-cadeias terem que ter comprimento
n.
Antes de passarmos aos exemplos seguintes pensemos numa
variante deste problema: queremos dividir a cadeia em pedaços de tamanho
n.
def divide_cadeia(pal,n):
""" divide a cadeia em pedações de tamanho n."""
for i in range(0,len(pal) - n + 1,n):
print(pal[i:i+n])
if __name__ == '__main__':
divide_cadeia('Monty Python',3)
Como se pode ver não precisámos de muita mudança. Bastou alterar o controlo do ciclo passando a usar o iterável range com três argumentos.
range(n_1, n_2, n_3) gera a sequência de inteiros a começar em n_1 (inclusivé), a terminar em n_2 (exclusivé) saltando de n_3 em n_3 elementos. Mas o que acontece se o número de caracteres não fôr divisível por
n? Bom, com esta solução os caracteres do último pedaço, mais pequeno perdem-se... Mas quisermos mesmo ver também o pedaço mais pequeno?
def divide_cadeia_b(pal,n):
""" divide a cadeia em pedações de tamanho n."""
for i in range(0,len(pal) - n + 1,n):
print(pal[i:i+n])
resto = len(pal)%n
if resto:
print(pal[-resto:])
Como se pode ver primeiro tentamos saber se é divisível (
linha 5). Se não for (teste da
linha 6), imprimimos o resto da palavra (
linha 7). Fácil, certo?
O segundo,
exercício 3.13, pede-nos todos os prefixos de uma cadeia de caracteres.
def prefixos(pal):
"""
Mostra os prefixos da palavra.
"""
for i in range(len(pal)):
print(pal[:i+1])
Usamos
[:i+1] porque se pretendem os prefixos que começam no início (
:) e porque a própria palavra é prefixo de si própria (
i+1).
Por fim, o
exercício 3.14, destina-se a escrever um programa que mostre todos os sufixos de umas cadeia de caracteres.
def sufixos(pal):
"""
Mostra os sufixos da palavra.
"""
for i in range(len(pal),-1,-1):
print(pal[i:])
O que temos a destacar aqui é o recurso ao iterável range com três argumentos. No caso, porque pretendemos os sufixos, caminhamos do fim da cadeia (
len(pal)) para o início. Usamos
-1 como condição de fim porque já sabemos que o último não é considerado, logo termina no elemento na posição
0! O salto é de
-1 em
-1 por razões óbvias.
Sem comentários:
Enviar um comentário