<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 17, 2017 at 1:53 PM, kirby urner <span dir="ltr"><<a href="mailto:kirby.urner@gmail.com" target="_blank">kirby.urner@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><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.<br></div></div></div></div></div></blockquote><div><br></div><div>I have one other way of sharing the prime number trial by division thing: as coroutines. I owe David Beazley on this one. The coroutine decorator jumps us to the first yield so that we can send numbers in right away. <br><br>primes weeds out composites, passing survivor primes to the printing coroutine (passed in as target).<br><br></div><div>In my Tractor class, a simple object that plows a Field leaving a trail of Unicode characters (raster pattern), I used yield both to output and input (instances would gradually run low on fuel, but one could refill), but David advises against this pattern. <br><br><a href="http://mathforum.org/kb/message.jspa?messageID=9507410">http://mathforum.org/kb/message.jspa?messageID=9507410</a> (talks about Tractor Math)<br></div><div><br># -*- coding: utf-8 -*-<br>"""<br>Created on Thu Oct 13 13:48:52 2016<br><br>@author: Kirby Urner<br><br>David Beazley:<br><a href="https://youtu.be/Z_OAlIhXziw?t=23m42s">https://youtu.be/Z_OAlIhXziw?t=23m42s</a><br><br>Trial by division, but this time the primes coroutine acts <br>more as a filter, passing qualified candidates through to<br>print_me, which writes to a file.<br>"""<br><br>def coroutine(func):<br>    """<br>    Advances decorated generator function to the first yield<br>    """<br>    def start(*args, **kwargs):<br>        cr = func(*args, **kwargs)<br>        cr.send(None)  # or next(cr) or cr.__next__()<br>        return cr<br>    return start<br>        <br>@coroutine<br>def print_me(file_name):<br>    with open(file_name, 'w') as file_obj:<br>        while True:<br>            to_print = (yield)<br>            file_obj.write(str(to_print)+"\n")<br>    <br>@coroutine<br>def primes(target):<br>    _primes_so_far = [2]<br>    while True:<br>        candidate = (yield)<br>        for prev in _primes_so_far:<br>            if not divmod(candidate, prev)[1]:<br>                break<br>            if prev**2 > candidate:<br>                _primes_so_far.append(candidate)<br>                target.send(candidate)<br>                break<br><br>output = print_me("primes.txt")<br>p = primes(output)<br><br>    <br>for x in range(3, 200, 2):  # test odds 3-199<br>    p.send(x)<br><br>with open("primes.txt", 'r') as file_obj:<br>    print(file_obj.read())<br>     <br></div></div><br></div></div>