<div dir="ltr"><div><div><div><div>I have this segment in my Python course (which I wrote, see below) where I show prime number generator using an iterator written in two ways: as a generator function and as a class. Just for kicks, I cut and pasted the code to Codesters and discovered that, while it replicates Python3 syntax, it's not yet a complete implementation of the language. yield and next are not supported keyword and builtin respectively. No problem, I put in a workaround.<br><br><a href="http://mybizmo.blogspot.com/2017/02/prime-numbers.html">http://mybizmo.blogspot.com/2017/02/prime-numbers.html</a> (screen shots)<br><br><a href="https://www.codesters.com/preview/4183156df3fa49e1b12a4ab206d280af/">https://www.codesters.com/preview/4183156df3fa49e1b12a4ab206d280af/</a> (runnable)<br><br></div>I had my 5th-8th graders run the code having discovered the concept of "prime number" was already familiar. I threw out some numbers asking if they were prime. The 8th grade girl was not fooled by 51. I sketched "trial by division" very briefly on the whiteboard but did not do any careful reading of the Python code, as at this age it's enough to just eyeball the stuff and realize it cuts and pastes.<br><br></div><div>The 2nd example below actually produces 3000 primes, not 30, despite the comment. :-D<br><br></div><div>Thanks to Wes for links, still following 'em.<br><br></div>Kirby<br><br></div>PS:  we also use MIT Scratch in this class. I'm still somewhat on a learning curve with that one. I got it to work for a Martian Math segment:<br><a href="http://controlroom.blogspot.com/2016/12/more-core.html">http://controlroom.blogspot.com/2016/12/more-core.html</a><br><br></div>What's Martian Math?<br><a href="http://wikieducator.org/Martian_Math">http://wikieducator.org/Martian_Math</a><br><a href="http://www.4dsolutions.net/satacad/martianmath/toc.html">http://www.4dsolutions.net/satacad/martianmath/toc.html</a><br><br><div><br><div># -*- coding: utf-8 -*-<br><div><div>"""<br>Created on Mon Mar 14 14:40:53 2016<br><br>@author: Kirby Urner<br><br>Create an iterable that gives back successive prime numbers in <br>two different ways:  as a class and as a generator function.<br><br>Trial by division involves accumulating all primes so far and<br>admitting new candidates to the club only if no prime up to <br>the sqrt of same, divides with no remainder.<br>"""<br><br>class Primes:<br><br>    def __init__(self):<br>        self.candidate = 1<br>        self._primes_so_far = [2]  # first prime, only even prime<br><br>    def __iter__(self):<br>        """I'm already an iterator so just return me as is"""<br>        return self<br>        <br>    def __next__(self):<br>        """proof I'm an iterator"""<br>        while True:<br>            self.candidate += 2    # check odds only from now on<br>            for prev in self._primes_so_far:<br>                if prev**2 > self.candidate:<br>                    self._primes_so_far.append(self.candidate)<br>                    return self._primes_so_far[-2]    <br>                if not divmod(self.candidate, prev)[1]: # no remainder!<br>                    break<br>            <br>def primes():<br>    """generate successive prime numbers (trial by division)"""<br>    candidate = 1<br>    _primes_so_far = [2]  # first prime, only even prime<br>    yield _primes_so_far[-1]<br>    while True:<br>        candidate += 2    # check odds only from now on<br>        for prev in _primes_so_far:<br>            if prev**2 > candidate:<br>                yield candidate  # surrender control at this point!<br>                _primes_so_far.append(candidate)<br>                break<br>            if not divmod(candidate, prev)[1]: # no remainder!<br>                break                          # done looping<br><br><br>#p = Primes()  # class based iterator<br>#print([next(p) for _ in range(30)])  # next 30 primes please!  <br><br>p = primes()  # generator function based iterator<br>print([next(p) for _ in range(3000)])  # next 30 primes please!  <br><br></div></div></div></div></div>