Small prog question from a newbie: abt variables in a function definition

Gabriel Genellina gagsl-py at yahoo.com.ar
Wed Nov 29 05:31:38 EST 2006


At Wednesday 29/11/2006 06:48, B Shyam Sundar wrote:

>I am a newbie as far as python is concerned ... I am trying to write 
>a code for playing bridge in obj oriented manner ..
>
>Well ... i have this small problem:
>
>class hand:
>     def __init__(self,set_of_cards=[]):
>         self.set_of_cards=set_of_cards
>     card_played_flag =0
>     def play(played_card):
>         for i in self.set_of_cards:
>             if self.set_of_cards[i] == played_card:
>                 self.set_of_cards.remove (played_card)
>      def sort_hand():
>         for i in self.set_of_cards:
>             for j in self.set_of_cards:
>                 if self.set_of_cards[j].face<self.set_of_cards[i].face
>                 self.set_of_cards 
> [j],self.set_of_cards[i]=self.set_of_cards[i],self.set_of_cards[j]
>          for i in self.set_of_cards:
>             for j in self.set_of_cards:
>                 if self.set_of_cards[j].suit<self.set_of_cards[i].suit
> 
>self.set_of_cards[j],self.set_of_cards[i]=self.set_of_cards[i],self.set_of_cards[j]
>
>I have created card as a class with the attributes of suit face so 
>.. card(suit,face)
>
>So my question is this ---
>
>The compiler doesnt recognise that there is self.set_of_cards[j] can 
>be a card. It gives a syntax error.
>Also I have not created any instance of the class (Can that be a problem)

(The compiler knows very few about your cards... Python is a very 
dynamic language, a lot of things happens at runtime)

Without compiling your example, I can see these syntax errors:
1) In Python indentation matters. sort_hand must have the same 
indentation as play (and the other methods).
2) Syntax for the if statement - you need a final ":"
if condition: something
if condition:
     do something
     and do other thing
     and do another thing

>So how do i fix this?
>Also can I specify that the list set_of_cards has only card objects? 
>IF yes how?

Short answer: don't bother. (Yes, you *could* inherit from list and 
restrict the contained items, but it's seldom used).

You don't have to sort manually, this should work: 
set_of_cards.sort(key=lambda card: (card.suit,card.face))

And don't use a mutable initializer in __init__: either use an empty 
tuple () or use None and check for it in the method body:
def __init__(self, set_of_cards=None):
     if set_of_cards is None: set_of_cards=[]
     self.set_of_cards = set_of_cards


-- 
Gabriel Genellina
Softlab SRL 

__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis! 
¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar



More information about the Python-list mailing list