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: O decisivo é a ordem em __next__: y recebe o valor atual de self.x, depois self.x é atualizado por z(self.x), e só então y é retornado. Como __iter__ fixa self.x = 128 e, nesta execução, z(a) leva os valores a 64, 32, 16 e 8, o quarto valor exibido é 16.

Tema central: Iteração em Python
Análise das alternativas
A
Errada
Incorreta. O número 4 não aparece como quarto valor exibido. Pelo rastreamento das cinco chamadas de next, a sequência impressa é 128, 64, 32, 16 e 8. Marcar 4 exige avançar além das cinco saídas efetivas ou confundir a continuidade da sequência com a posição pedida.
B
Errada
Incorreta. O número 8 é o quinto valor exibido, não o quarto. A contagem correta das impressões é: 1ª 128, 2ª 64, 3ª 32, 4ª 16, 5ª 8.
C
Certa
A alternativa C está correta porque a quarta chamada de next retorna o valor corrente armazenado antes da atualização. Com iter(coisa), __iter__ define self.x = 128. Em cada __next__, o retorno é y, que recebe o valor atual de self.x, enquanto a atualização para o próximo passo ocorre depois. Assim, as quatro primeiras saídas são 128, 64, 32 e 16; portanto, a quarta impressão é 16.
D
Errada
Incorreta. O número 32 é o terceiro valor exibido. Isso contraria a ordem efetiva das saídas produzidas por next, que retorna o valor anterior à atualização do estado interno.
E
Errada
Incorreta. O número 64 é o segundo valor exibido, porque 128 é retornado na primeira chamada de next antes da primeira atualização. Essa alternativa decorre de ignorar que o retorno em __next__ ocorre antes de self.x ser modificado.
Pegadinha da questão
A confusão real é tomar como saída o novo valor de self.x após self.x = z(self.x), quando o método __next__ retorna o valor antigo guardado em y; somada a isso, a banca explora erro de posição ordinal entre terceiro, quarto e quinto termo.
Dica para questões semelhantes
  • Em código com __iter__ e __next__, identifique separadamente o valor inicial do estado interno e o que é efetivamente retornado em cada chamada.
  • Verifique a ordem exata dentro de __next__: capturar valor, atualizar estado e retornar não são etapas equivalentes.
  • Monte a sequência das saídas impressas, não apenas a sequência dos estados internos após atualização.
  • Quando a pergunta pedir posição ordinal, conte as impressões uma a uma antes de marcar a alternativa.

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