Questão nº 78
Questão de Fluência em Dados · FGV Receita Federal do Brasil 2023 - Manhã (nº 78)
Analise o código Python a seguir.
```python
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.
- A4
- B8
- C16 (alternativa correta)
- D32
- E64
Resposta comentada
Gabarito Alternativa C
Um iterador em Python é um objeto que permite percorrer uma sequência de dados, um item por vez, sem precisar carregar toda a sequência na memória. Ele faz isso implementando dois métodos especiais: __iter__, que retorna o próprio objeto iterador, e __next__, que retorna o próximo item da sequência e atualiza o estado interno para a próxima chamada.
Vamos rastrear os valores retornados pelo iterador:
- Inicialização: Quando
xpto = iter(coisa)é chamado, o método__iter__da classeenigmaé executado. Ele defineself.x = 128. - Primeira iteração (k=0):
print(next(xpto))chama__next__.yrecebe o valor atual deself.x, que é128.self.xé atualizado paraz(128) = 128 - int(128/2) = 128 - 64 = 64.- Retorna
y, que é128. (Primeiro número exibido)
- Segunda iteração (k=1):
print(next(xpto))chama__next__.yrecebe o valor atual deself.x, que é64.self.xé atualizado paraz(64) = 64 - int(64/2) = 64 - 32 = 32.- Retorna
y, que é64. (Segundo número exibido)
- Terceira iteração (k=2):
print(next(xpto))chama__next__.yrecebe o valor atual deself.x, que é32.self.xé atualizado paraz(32) = 32 - int(32/2) = 32 - 16 = 16.- Retorna
y, que é32. (Terceiro número exibido)
- Quarta iteração (k=3):
print(next(xpto))chama__next__.yrecebe o valor atual deself.x, que é16.self.xé atualizado paraz(16) = 16 - int(16/2) = 16 - 8 = 8.- Retorna
y, que é16. (Quarto número exibido)
- Quinta iteração (k=4):
print(next(xpto))chama__next__.yrecebe o valor atual deself.x, que é8.self.xé atualizado paraz(8) = 8 - int(8/2) = 8 - 4 = 4.- Retorna
y, que é8. (Quinto número exibido)
A sequência de números exibidos é: 128, 64, 32, 16, 8. O quarto número exibido é 16.
- (A) Incorreta: O valor 4 seria o quinto valor de
self.xapós a atualização ou o resultado da funçãozaplicada ao quinto valor retornado, mas não o quarto número exibido. - (B) Incorreta: O valor 8 é o quinto número exibido. Esta é a alternativa mais tentadora, pois 8 é o valor de
self.xapós a quarta atualização, mas o método__next__retorna o valor deself.xantes da atualização para a próxima iteração. A armadilha aqui é confundir o valor que é retornado (y) com o valor atualizado deself.xpara a próxima chamada. - (C) Correta: Conforme a análise passo a passo, o quarto número retornado e exibido é 16.
- (D) Incorreta: O valor 32 é o terceiro número exibido.
- (E) Incorreta: O valor 64 é o segundo número exibido.
Fonte: FGV Receita Federal do Brasil 2023 - Manhã Auditor-Fiscal da Receita Federal do Brasil (Caderno Tipo 1). Reproduzida para fins de estudo.