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.
1.
def
sub_cadeias(pal, n):
2.
3.
4.
5.
for
i
in
range(len(pal)
-
n
+
1
):
6.
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.
1.
def
divide_cadeia(pal,n):
2.
3.
for
i
in
range(
0
,len(pal)
-
n
+
1
,n):
4.
print
(pal[i:i
+
n])
5.
6.
if
__name__
=
=
'__main__'
:
7.
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?
1.
def
divide_cadeia_b(pal,n):
2.
3.
for
i
in
range(
0
,len(pal)
-
n
+
1
,n):
4.
print
(pal[i:i
+
n])
5.
resto
=
len(pal)
%
n
6.
if
resto:
7.
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.
1.
def
prefixos(pal):
2.
3.
4.
5.
for
i
in
range(len(pal)):
6.
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.
1.
def
sufixos(pal):
2.
3.
4.
5.
for
i
in
range(len(pal),
-
1
,
-
1
):
6.
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