Questão nº 78

Questão de Fluência em Dados · FGV Receita Federal do Brasil 2023 - Manhã (nº 78)

FGV2023Auditor-Fiscal da Receita Federal do BrasilFluência em Dados
Gabarito: Cver comentário ↓

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.

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:

  1. Inicialização: Quando xpto = iter(coisa) é chamado, o método __iter__ da classe enigma é executado. Ele define self.x = 128.
  2. Primeira iteração (k=0):
    • print(next(xpto)) chama __next__.
    • y recebe o valor atual de self.x, que é 128.
    • self.x é atualizado para z(128) = 128 - int(128/2) = 128 - 64 = 64.
    • Retorna y, que é 128. (Primeiro número exibido)
  3. Segunda iteração (k=1):
    • print(next(xpto)) chama __next__.
    • y recebe o valor atual de self.x, que é 64.
    • self.x é atualizado para z(64) = 64 - int(64/2) = 64 - 32 = 32.
    • Retorna y, que é 64. (Segundo número exibido)
  4. Terceira iteração (k=2):
    • print(next(xpto)) chama __next__.
    • y recebe o valor atual de self.x, que é 32.
    • self.x é atualizado para z(32) = 32 - int(32/2) = 32 - 16 = 16.
    • Retorna y, que é 32. (Terceiro número exibido)
  5. Quarta iteração (k=3):
    • print(next(xpto)) chama __next__.
    • y recebe o valor atual de self.x, que é 16.
    • self.x é atualizado para z(16) = 16 - int(16/2) = 16 - 8 = 8.
    • Retorna y, que é 16. (Quarto número exibido)
  6. Quinta iteração (k=4):
    • print(next(xpto)) chama __next__.
    • y recebe o valor atual de self.x, que é 8.
    • self.x é atualizado para z(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.x após a atualização ou o resultado da função z aplicada 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.x após a quarta atualização, mas o método __next__ retorna o valor de self.x antes da atualização para a próxima iteração. A armadilha aqui é confundir o valor que é retornado (y) com o valor atualizado de self.x para 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.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho