"""
More objected oriented programming
http://openbookproject.net/thinkcs/python/english2e/ch16.html
"""
import random
class Card :
ranks = ["2", "3", "4" , "5", "6", "7", "8", "9", "10",
"Jack", "Queen", "King", "Ace"]
suits = ["Clubs", "Diamonds", "Hearts", "Spades"]
def __init__(self, rank, suit) :
if rank not in Card.ranks :
raise ValueError, "bad rank"
if suit not in Card.suits :
raise ValueError, "bad suit"
self.suit = Card.suits.index(suit)
self.rank = Card.ranks.index(rank)
def __repr__(self):
return (Card.ranks[self.rank] + " of " + Card.suits[self.suit])
def __cmp__(self, other):
"""Compare cards on the basis of their rank"""
if self.rank > other.rank: return 1
if self.rank < other.rank: return -1
return 0
c1 = Card("Jack", "Spades")
c2 = Card("King", "Hearts")
c1 < c2
# Observations about the class:
# The arrays "ranks" and "suits" are not instance attributes - they are class attributes,
# i.e. variables that are associated with the class itself. You can access them as
# self.ranks and self.suits, but also as Card.ranks and Card.suits which more explicitly
# shows that they are class attributes. All instances of the class share the same
# instances of those variables. Therefore, if you modify class variables, that affects
# all instances of the class.
# The __cmp__ method defines the behavior of the comparison operators == != < > <= >=
class Deck :
def __init__(self) :
self.cards = []
for suit in Card.suits :
for rank in Card.ranks :
self.cards.append(Card(rank, suit))
def shuffle(self) :
random.shuffle(self.cards)
def __len__(self) :
return len(self.cards)
def __repr__(self):
s = [str(card) for card in self.cards]
return "\n".join(s)
def __getitem__(self, key) :
return self.cards.__getitem__(key)
def remove(self, card):
if card in self.cards:
self.cards.remove(card)
return True
else:
return False
def deal_card(self) :
return self.cards.pop()
def is_empty(self) :
return len(self) == 0
# Notes on the Deck class:
# __len__ is the function that gets called when the len function is called.
# Note the use of remove and pop in the remove and deal_card methods.
# Documentation of the set of all special methods (___xxx___) that are used to customize
# the behavior of a class are found at the python language reference manual at:
# http://docs.python.org/reference/datamodel.html#basic-customization
# Comments on list comprehension
# A common task in python is creating lists.
# For example if we wanted to created a list of all the squares of the elements
# in a given list we would do:
a = range(10)
squared = []
for element in a :
squared.append(a**2)
# Python has a concise way of doing this using a construct called list comprehension.
# List comprehension provides a compact way of mapping a list into another list by
# applying a function to each element of the list.
# Examples:
fruit_list = [' banana', ' strawberry ', 'passion fruit ']
print [fruit.strip() for fruit in fruit_list]
vec = [2, 4, 6]
print [3*x for x in vec]
print [3*x for x in vec if x > 3]
print [(x, x**2) for x in vec]
li = ["a", "asa", "foo", "b", "c", "b", "d", "d"]
print [elem for elem in li if len(elem) > 1]
