cs107-lecture-examples

Example codes used during Harvard CS107 lectures
git clone https://git.0xfab.ch/cs107-lecture-examples.git
Log | Files | Refs | README | LICENSE

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()