I want to be able to execute the following code:

```
for i in Squares(5, 50):
print(i)
```

Now this is very easy to implement using a loop, however I want to use an iterator.

So I have defined the following class:

```
import math
class Squares(object):
def __init__(self, start, stop):
self.start = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
start = self.start
stop = self.stop
squareroot = math.sqrt(start)
if self.start > self.stop:
raise StopIteration
if squareroot == math.ceil(squareroot):
start += 1
```

But at the moment this is returning `None`

an infinite amount of times. This means the none must be because the `StopIteration`

is being executed even when it shouldn't. I think my `if squareroot == math.ceil(squareroot):`

condition is correct because I tested it separately, but I can't figure out what to change to get the output I want. Any help is appreciated.

EDIT: For a code such as:

```
for i in Squares(4, 16):
print(i)
```

I would expect the output to be:

```
4
9
16
```

## Best Solution

Try creating a generator function:

And then loop it:

which prompts:

EDIT: edited to match the square definition, not the previous square power (sorry :P). Added +1 to the range to match the question example of the OP.