[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