*info_outline*

Solutions will be available when this assignment is resolved, or after a few failing attempts.

# Prime Numbers Iterators

We're going to increase the complexity of our iterators practice by building an Iterator that returns only Prime Numbers. Before jumping to the Iterator itself, we've made a decision about how the object should check if a number is prime. The `PrimeNumbersIterator`

has a `_is_prime(num)`

method that accepts a natural number and returns `True`

or `False`

depending if it's prime or not. Example:

```
obj = PrimeNumbersIterator()
obj._is_prime(3) # True
obj._is_prime(199) # True
obj._is_prime(20) # False
```

This means that you'll be able to use the `_is_prime(num)`

method inside your `__next__`

method.

Now, about that iterator. This is an example of how it should work:

```
iterator = iter(PrimeNumbersIterator())
next(iterator) # 2
next(iterator) # 3
next(iterator) # 5
next(iterator) # 11
next(iterator) # 13
# ... fast forward ...
next(iterator) # 163
next(iterator) # 167
next(iterator) # 173
# Etc.
```

### Test Cases

test prime numbers - Run Test

```
def test_prime_numbers():
iterator = iter(PrimeNumbersIterator())
assert next(iterator) == 2
assert next(iterator) == 3
assert next(iterator) == 5
assert next(iterator) == 7
assert next(iterator) == 11
assert next(iterator) == 13
assert next(iterator) == 17
assert next(iterator) == 19
assert next(iterator) == 23
assert next(iterator) == 29
assert next(iterator) == 31
assert next(iterator) == 37
```

test is prime - Run Test

```
def test_is_prime():
obj = PrimeNumbersIterator()
prime_numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]
for number in prime_numbers:
assert obj._is_prime(number) is True, "{} should be prime".format(number)
not_prime_numbers = [4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20, 24, 25, 26]
for number in not_prime_numbers:
assert obj._is_prime(number) is False, "{} should NOT be prime".format(number)
```