Intellipaat Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in Python by (16.4k points)

Have a look at the following code:

for i in Squares(5, 50):

      print(i)

Presently this is exceptionally simple to execute utilizing a loop, anyway I need to utilize an iterator. 

So I have characterized the accompanying 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

Be that as it may, right now this is returning None a boundless measure of times. This implies the none should be on the grounds that the StopIteration is being attempted in any event, when it shouldn't. I think me if squareroot == math.ceil(squareroot): the condition is right since I tried it independently, however, I can't sort out what to change to get the yield I need. Any assistance is valued.

For the below code:

for i in Squares(4,16):

print(i)

What I expect the output to me:

4

9

16

1 Answer

0 votes
by (26.4k points)

Just try to create a generator function:

from math import sqrt, ceil

def Squares(start, stop):

    for i in range(start, stop+1):

        sqrti = sqrt(i)

        if sqrti == ceil(sqrti):

            yield i

Then, loop it:

for i in Squares(4, 20):

    print i,

which gives:

4 9 16

Join the python online course fast, to learn python concepts in detail and get certified.

For more details, do check out the below video tutorial...

Related questions

31k questions

32.8k answers

501 comments

693 users

Browse Categories

...