Analise o código Python a seguir. class enigma: def __iter__(self): self.x = 128 return self def __next__(self): y = self.x z = lambda a : a - int(a/2) self.x = z(self.x) return y coisa = enigma() xpto = iter(coisa) for k in range(5): print(next(xpto)) Assinale o quarto número exibido na execução desse código.
- A)4
Errada, porque 4 aparece mais adiante na sequencia, nao como o quarto valor.
- B)8
Errada, porque 8 tambem surge depois, mas nao ocupa a quarta posicao.
- C)16
Certa, pois a sequencia impressa e 128, 64, 32, 16, 8, entao o quarto numero exibido e 16.
- D)32
Errada, porque 32 e o terceiro valor mostrado, nao o quarto.
- E)64
Errada, porque 64 e o segundo valor exibido.
Gabarito: C
Aqui a ideia central é iterar sobre um objeto Python personalizado. Quando voce define __iter__(), o objeto passa a ser iteravel, e quando define __next__(), voce controla o que sera devolvido a cada chamada de next(). No codigo, __iter__() inicia self.x em 128 e devolve o proprio objeto, que vira o iterador. Ja __next__() pega o valor atual de x, calcula o proximo com a regra z(a) = a - int(a/2), e devolve o valor antigo. Em outras palavras: ele vai cortando o numero pela metade a cada passo, mas sempre entregando o valor anterior primeiro.