Fácil Python

Gerador de números pares

Enunciado

Escreva uma função geradora pares(n) que produza os números pares de 0 até n-1 (inclusive se n for ímpar). Use yield.

Requisitos

  • A função deve ser um gerador (usar yield).
  • Deve aceitar um inteiro n e gerar apenas números pares menores que n.
  • O resultado deve ser consumido em um for e impresso um por linha.

Código inicial

def pares(n):
    # complete usando yield
    pass

# Teste:
for p in pares(10):
    print(p)

Saída esperada

0
2
4
6
8
Ver dica

Percorra range(0, n) e verifique se o número é par com if x % 2 == 0 antes de dar yield.

Mostrar solução
def pares(n):
    """Gera números pares de 0 até n-1."""
    for x in range(n):
        if x % 2 == 0:
            yield x  # só produz quando o número é par

# Consome o gerador e imprime cada valor
for p in pares(10):
    print(p)

Passo a passo

  1. Definimos a função pares(n) com um for que percorre range(n).
  2. A cada iteração, testamos x % 2 == 0 para saber se x é par.
  3. Se for par, yield x pausa a função e devolve o valor para quem está consumindo.
  4. O laço for p in pares(10) chama next() repetidamente até o gerador se esgotar.
  5. Cada valor par é impresso em uma linha.

Por que funciona

O yield transforma a função em um gerador. Em vez de construir uma lista inteira, o código só calcula o próximo par quando o for pede. Isso é avaliação preguiçosa: os valores são produzidos um a um, sob demanda.

Erros comuns

  • Esquecer o yield e usar return: a função retorna None e o for falha com TypeError: 'NoneType' object is not iterable.
  • Usar range(0, n, 2) diretamente no for sem gerador: funciona, mas não é um gerador; o enunciado pede yield.
  • Confundir range(n) com range(n+1): o intervalo é 0 a n-1, então pares(10) não inclui 10.

Outra forma de resolver

Se a intenção fosse apenas obter os pares, poderia ser uma expressão geradora:

def pares(n):
    return (x for x in range(n) if x % 2 == 0)

Essa versão é mais curta e também preguiçosa, mas o enunciado pede explicitamente yield.

Saída esperada

0
2
4
6
8