🎯 Saiba o que estudar

Avançado com Treinador a partir de R$ 0,76/dia

Analise o código Python a seguir.class enigma:     def __ite...

Próximas questões
Com base no mesmo assunto
Q2096191 Programação
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.
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Gabarito: C

Fundamento decisivo: A decisão dependia de identificar que a pergunta pede o quarto número exibido e que, no iterador, o valor retornado em cada chamada é o anterior à atualização de self.x.

Tema central: iterador em Python
Análise das alternativas
A
Errada
Incorreta. 4 aparece depois do quarto valor exibido; pela sequência produzida, o quarto número impresso é 16.
B
Errada
Incorreta. 8 é o quinto valor exibido, não o quarto. O rastreamento das chamadas mostra: 1º 128, 2º 64, 3º 32, 4º 16, 5º 8.
C
Certa
A alternativa C está certa porque o procedimento correto é acompanhar o estado interno do iterador. Após iter(coisa), o método __iter__ define self.x = 128. Em cada __next__, o valor retornado é o valor antigo de x, pois y recebe self.x antes da atualização; só depois x passa a x - int(x/2), que nesse caso equivale à metade. Assim, as quatro primeiras saídas são 128, 64, 32 e 16, de modo que o quarto número exibido é 16.
D
Errada
Incorreta. 32 é o terceiro valor exibido, portanto não pode ser o quarto número mostrado.
E
Errada
Incorreta. 64 é o segundo valor exibido. A sequência começa em 128, porque a primeira saída é o valor inicial antes de qualquer redução.
Pegadinha da questão
A confusão real era tomar como saída o valor já atualizado de self.x, quando o código primeiro retorna o valor atual e só depois faz a atualização; outra armadilha era ignorar que a primeira impressão é 128, não 64.
Dica para questões semelhantes
  • Em iteradores, verifique a ordem entre retorno e atualização do estado interno.

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

O código define uma classe que implementa os métodos e necessários para que um objeto da classe possa ser usado como iterador. Quando um objeto da classe é criado e seu método é chamado, ele inicializa a variável com o valor 128 e retorna .

O método é responsável por retornar o próximo elemento da sequência. Ele armazena o valor atual de na variável , calcula o próximo valor de aplicando uma função lambda que subtrai a metade do valor de do próprio valor, e então retorna o valor de .

No loop , um objeto iterador é criado a partir de um objeto e é chamado o método do iterador para imprimir os próximos valores da sequência. Como o loop é executado 5 vezes, serão impressos os primeiros 5 valores da sequência.

Os primeiros quatro valores da sequência serão 128, 64, 32 e 16, respectivamente. Portanto, o quarto número exibido na execução do código será 16.

Como resolver questões de Python sem identação?

Essa questão precisa de formatação. Para ajudar na compreensão:

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))

Os números exibidos são:

128

64

32

16

8

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))

1ª iteração

self.x = 128 / 2 = 64

retorna y=128

2ª iteração

self.x = 64 / 2 = 32

retorna y=64

3ª iteração

self.x = 32 / 2 = 16

retorna y=32

4ª iteração

self.x = 16 / 2 = 8

retorna y=16

5ª iteração

self.x = 8 / 2 = 4

retorna y=8

O quarto item que será impresso é 16.

A prova com indentação está nesse link:

https://arquivos.qconcursos.com/prova/arquivo_prova/92309/fgv-2023-receita-federal-auditor-fiscal-manha-prova.pdf?_ga=2.241499850.977960604.1700742582-2048531100.1700742582

Questão 78

Resolvendo a questão:

para k=1

y <- x = 128

z = 128/2 = 64

x <- z = 64

return y

apresenta na tela o valor de Y (128)

para k=2

y <- x = 64

z = 64/2 = 32

x <- z = 32

return y

apresenta na tela o valor de Y (64)

para k=3

y <- x = 32

z = 32/2 = 16

x <- z = 16

return y

apresenta na tela o valor de Y (32)

para k=4

y <- x = 16

z = 16/2 = 8

x <- z = 8

return y

apresenta na tela o valor de Y (16)

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo