Iterator protocol
Toda vez que você usa um loop for em Python, o interpretador chama __iter__ e __next__ por baixo dos panos. Implementar esses métodos manualmente permite criar objetos que iteram de forma personalizada, como geradores sem usar yield. Dominar o protocolo iterador é útil para trabalhar com streams de dados, leitura de arquivos linha a linha ou qualquer sequência que só pode ser percorrida uma vez.
O PROBLEMA
Contagem com __iter__ e __next__ para contar de start a end.
SOBRE O CONCEITO
O protocolo iterador exige que a classe implemente __iter__ (retornando o próprio objeto iterador) e __next__ (que retorna o próximo valor ou levanta StopIteration quando acaba). No exercício, Contagem deve guardar o estado atual e o limite. O erro comum de esquecer StopIteration faz com que o for nunca pare — ele continuará chamando __next__ e, sem o raise, o Python retornará None ou lançará um AttributeError. Por isso, dentro de __next__, você precisa verificar se atingiu o fim e usar raise StopIteration para sinalizar o término da iteração.
RESOLUÇÃO