Analise o código Python a seguir. for num in enigma(10): print(num) Dado que a execução desse código exibe 10 números inteiros, a formulação correta para a função enigma é:
- A)def enigma(n): for i in range(n): yield i
Correta, porque `yield` transforma a função em geradora e produz 10 inteiros para o `for` imprimir.
- B)def enigma(n): for i in range(n): return i
Errada, porque `return` encerra a função na primeira execução e não gera uma sequência de valores.
- C)def enigma(n): for i in range(n): if i == 0: return i else: return (enigma3(n-1))
Errada, porque a lógica com `return` não mantém uma iteração contínua e ainda referencia uma função incoerente no enunciado.
- D)def enigma(n): return n * range(n)
Errada, porque `n * range(n)` não é uma definição válida de função geradora para iterar assim em Python.
- E)def enigma(n): return n!
Errada, porque `n!` nem é sintaxe válida em Python para fatoração.
Gabarito: A
Em Python, um `for` só consegue percorrer o que seja iterável, e funções que usam `yield` viram geradoras. A sacada aqui é essa: quando a função produz valores com `yield`, ela não devolve tudo de uma vez, ela vai entregando um por um, exatamente para o laço `for` consumir. No enunciado, o código externo faz `for num in enigma(10):`, então a função `enigma` precisa retornar uma sequência de 10 valores inteiros, um por iteração. A opção correta faz isso com `for i in range(n): yield i`, isto é, gera os números de `0` até `n-1`. Com `n = 10`, aparecem 10 inteiros na tela. As outras alternativas quebram essa lógica. `return` encerra a função na primeira passada, então não serve para produzir vários valores em sequência dentro de um `for`. Já expressões como `n * range(n)` e `n!` não são formas válidas de construir esse iterável em Python nesse contexto. Resumo de prova: se a questão fala em percorrer vários valores com `for`, desconfie de funções geradoras. `yield` costuma ser o caminho, porque entrega os itens aos poucos, sem querer bancar o herói e resolver tudo de uma vez.