Considere o código Python 2.7 a seguir. def ABC(L, n): while True: if len(L) >= n: return L else: L.append(len(L) ** 2) print ABC([20],10) O resultado da execução desse código é:
- A)[1, 4, 9, 16, 25, 36, 49, 64]
Errada, porque ignora o 20 inicial e ainda nao chega a 10 elementos.
- B)[1, 4, 9, 16, 25, 36, 49, 64, 81]
Errada, porque a lista nao comeca vazia e o ultimo valor 81 ate aparece, mas o 20 inicial foi esquecido.
- C)[20, 1, 4, 9, 16, 25, 36, 49, 64]
Errada, porque para com 9 elementos e nao executa todas as iteracoes necessarias ate n = 10.
- D)[20, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Certa, porque a lista inicial [20] recebe os quadrados dos tamanhos 1 ate 9, chegando a 10 elementos no retorno.
- E)[20, 4, 9, 16, 25, 36, 49, 64, 81]
Errada, porque o segundo elemento nao pode ser 4: o primeiro valor inserido e o quadrado do tamanho 1, isto e, 1.
Gabarito: D
Aqui a ideia é bem simples: a função fica em um laco infinito, mas ela mesma cria a saida de emergencia. Enquanto o tamanho da lista for menor que n, ela adiciona um novo elemento: o quadrado do tamanho atual da lista. Ou seja, o valor inserido depende do numero de elementos que a lista ja tem naquele instante. Como a chamada comeca em ABC([20], 10), a lista inicial tem tamanho 1. Entao o primeiro valor acrescentado sera 1**2 = 1. Depois vem 2**2 = 4, depois 3**2 = 9, e assim por diante, ate a lista atingir 10 elementos. Quando isso acontece, o teste len(L) >= n vira verdadeiro e a funcao retorna a propria lista. Em Python, listas sao mutaveis, entao a lista original vai sendo alterada dentro da funcao sem truques escondidos. Por isso, o resultado exibido e [20, 1, 4, 9, 16, 25, 36, 49, 64, 81], que corresponde a alternativa D. O padrao aqui e o classico: a banca gosta de testar leitura atenta de laco, condicao de saida e efeitos da mutabilidade da lista.