quinta-feira, 17 de outubro de 2013

Exercícios 3.12, 3.13, 3.14 (ako of Pi) do livro

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