How am I doing?

John Hazen john at hazen.net
Mon Sep 19 20:15:35 EDT 2005


* Jason <jason at jasonmhirst.co.uk> [2005-09-19 16:28]:
> I've restructured my code with the assistance of George and Mike which 
> is now as follows...
> 
> import random
> 
> class HiScores:
>      def __init__(self,hiScores):
>          self.hiScores=[(entry[:5],entry[5:]) for entry in hiScores]

With your redefined hiScores, the above is wrong.  I think it should
just be:
           self.hiScores=[entry for entry in hiScores]

Your original code used the slicing to pull the score and name out of a
single string.  Since you've split the string into its two parts, you
don't need the indexing anymore.

>      def showScores(self):
>          for name,score in self.hiScores:
>              print "%s - %s" % name,score

The error you cite below is due to trying to zfill an integer, not a
string.  I'm not going to modify your code, but I would use integers all
over for the scores, and only turn to a string (and do the zfill) when
outputting it.

       def showScores(self):
           for name,score in self.hiScores:
               score = str(score).zfill(5)  #untested
               print "%s - %s" % name,score

> def main():
>  
> hiScores=[('10000','Alpha'),('07500','Beta'),('05000','Gamma'),('02500','Delta'),('00000','Epsilon')] 

This looks like an indentation error to me.  Is hiScores indented in
your version?

>      a=HiScores(hiScores)
>      print "Original Scores\n---------------"
>      a.showScores()
> 
>      while 1:
>          newScore=random.randint(0,10000)

As I said, I would use int's throughout, but to use it as-is, change the
above line to:
           newScore=str(random.randint(0,10000))

>          if newScore.zfill(5) > a.lastScore():
>              print "Congratulations, you scored %d " % newScore
>              name=raw_input("Please enter your name :")
>              a.addScore(newScore,name)
>              a.showScores()
> 
> if __name__=="__main__":
>      main()

<snip>

> 1) The most important is that when run, the program crashes with
> 
> AttributeError: 'int' object has no attribute 'zfill'
> 
> I've read as many websites as I can about zfill and I can't see why on 
> earth it's failing.

I think I explained this above.  You're trying to call a string method
on an integer.

> 
> 2) The output of the predefined hiscores is now...
> 
> 10000 - Alpha ()
> 07500 - Beta ()
> 05000 - Gamma ()
> 02500 - Delta ()
> 00000 - Epsilon ()

Are you sure it's not:

('10000', 'Alpha') - ()
etc.  ?

I think this is a result of your still doing indexing to separate the
score and the name, even though you've already separated the name and
score into tuples in the predefined list:

>>> hiScores=[('10000','Alpha'),('07500','Beta'),('05000','Gamma'),('02500','Delta'),('00000','Epsilon')]
>>> s=hiScores[0]
>>> s
('10000', 'Alpha')
>>> s[:5]
('10000', 'Alpha')
>>> s[5:]
()
>>> p = (s[:5],s[5:])
>>> p
(('10000', 'Alpha'), ())
>>> print "%s - %s" % p
('10000', 'Alpha') - ()
>>> 


> Why are there the pairing parenthesis there?  George very kindly showed 
> me another way which was to have...
> 
> def showScores(self):
>            for entry in self.hiScores:
>                print entry[0:5]," - ",entry[5:]
> 
> But using that method output the entire list in it's full format (sorry 
> if that's not the correct terminology).  But give me a small plus mark 
> for changing code and not simply copying George :)
> 
> 3) The hardest thing to 'understand' is the line...
> 	self.hiScores=[(entry[:5],entry[5:]) for entry in hiScores]

This is now slicing into the tuple for each entry, instead of into the
string, so your results are unexpected.  slicing past the end of a tuple
returns the empty tuple (which I think is the '()' you're getting in
your output.

> TIA

HTH-

John



More information about the Python-list mailing list