[Tutor] generators and classes

Marilyn Davis marilyn at deliberate.com
Tue Feb 24 13:08:12 EST 2004


Thank you Lloyd.

On Tue, 24 Feb 2004, Lloyd Kvam wrote:

> Look at SimPy for some generator code with classes that would be hard to
> do otherwise.
> 
> http://simpy.sourceforge.net/
> Home

I can't take on such a big study right now.

I did do 2 other implementations, one with __get_item__ and one with
__iter__  --> just in case anyone is interested, here they are.

I like __get_item__ best, which is this one:

#! /usr/bin/env python2.2

import random

class NumberHat:
    '''Generator to deliver randomly chosen values from bot
to over_top - 1, delivering each value once only.  This one
implements __getitem__ so you can access the numbers with
[].'''
    def __init__(self, bot, over_top):
        self.bot = bot
        self.over_top = over_top
        self.numbers = []
        for i in range(bot, over_top):
            while 1:
                new_number = random.randrange(self.bot, self.over_top)
                if new_number in self.numbers:
                    continue
                self.numbers.append(new_number)
                break

    def __getitem__(self,i):
        return self.numbers[i]

    def __repr__(self):
        return str([num for num in self.numbers])

if __name__ == '__main__':
    hat = NumberHat(0,10)
    print hat
    print [hat[i] for i in range(10)]
    print [num for num in hat]
            
############################################################
# OUTPUT:
# bash-2.05a$ ./numberhat2.py
# [3, 7, 2, 5, 0, 6, 8, 1, 4, 9]
# [3, 7, 2, 5, 0, 6, 8, 1, 4, 9]
# [3, 7, 2, 5, 0, 6, 8, 1, 4, 9]
# bash-2.05a$ 

-----

#! /usr/bin/env python2.2

import random

class NumberHat:
    '''Generator to deliver randomly chosen values from bot
to over_top - 1, delivering each value once.  This one
implements an __iter__ method so that you can use a next()
call.'''
    
    def __init__(self, bot, over_top):
        self.bot = bot
        self.over_top = over_top
        self.numbers = []
        for i in range(bot, over_top):
            while 1:
                new_number = random.randrange(self.bot, self.over_top)
                if new_number in self.numbers:
                    continue
                self.numbers.append(new_number)
                break
        self.at = -1

    def __iter__(self):
        return self

    def next(self):
        self.at += 1
        return self.numbers[self.at]

    def __repr__(self):
        return str([num for num in self.numbers])

if __name__ == '__main__':
    hat = NumberHat(0,10)
    print hat
    print [hat.next() for x in range(10)]
            
############################################################
# OUTPUT:
# bash-2.05a$ ./numberhat3.py
# [7, 2, 6, 1, 4, 3, 8, 9, 5, 0]
# [7, 2, 6, 1, 4, 3, 8, 9, 5, 0]
# bash-2.05a$ 




More information about the Tutor mailing list