FrenchDeck.py (1653B)
1 #!/usr/bin/env python3 2 # File : FrenchDeck.py 3 # Created : Fri Sep 17 2021 08:12:06 PM (-0400) 4 # Description: Code based on Example 1-1 Fluent Python: Clear, Concise, and 5 # Effective Programming by Luciano Ramalho (O'Reilly Media, 2015) 6 # Copyright 2021 Harvard University. All Rights Reserved. 7 from collections import namedtuple 8 9 Card = namedtuple('Card', ['rank', 'suit']) 10 11 12 class FrenchDeck: 13 """French deck of 52 playing cards""" 14 ranks = [str(rank) for rank in range(2, 11)] + list('JQKA') 15 suits = 'spades diamonds clubs hearts'.split() 16 17 def __init__(self): 18 """Initialize ordered deck of cards""" 19 self._cards = [ 20 Card(rank, suit) for suit in self.suits for rank in self.ranks 21 ] 22 23 def __len__(self): 24 """Return length of deck""" 25 return len(self._cards) 26 27 def __getitem__(self, index): 28 """Return card at index""" 29 return self._cards[index] 30 31 def __setitem__(self, index, card): 32 """Set a card at index""" 33 self._cards[index] = card # this method does not return a value 34 35 def __str__(self): 36 """Pretty print card deck""" 37 map_utf8 = { 38 'clubs': '♣', 39 'diamonds': '♦', 40 'hearts': '♥', 41 'spades': '♠' 42 } 43 cpl = 13 # number of cards per printed line 44 pretty = [] 45 for line in range((len(self._cards) + cpl - 1) // cpl): 46 for card in self._cards[line * cpl:(line + 1) * cpl]: 47 pretty.append(f" {card.rank:>2}{map_utf8[card.suit]}") 48 pretty.append('\n') 49 return ''.join(pretty).rstrip()