Skip to content

Instantly share code, notes, and snippets.

@travishen
Created July 11, 2019 15:27
Show Gist options
  • Save travishen/110b43afb2f233d41ea242aed2382529 to your computer and use it in GitHub Desktop.
Save travishen/110b43afb2f233d41ea242aed2382529 to your computer and use it in GitHub Desktop.
Delegating Python Iterator
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"_SUITS = ('Spades', 'Hearts', 'Diamonds', 'Clubs')\n",
"_RANKS = tuple(range(2, 11) ) + ('J', 'Q', 'K', 'A')\n",
"from collections import namedtuple\n",
"\n",
"Card = namedtuple('Card', 'rank suit')\n",
"\n",
"class CardDeck:\n",
" def __init__(self):\n",
" self.length = len(_SUITS) * len(_RANKS)\n",
"\n",
" def __len__(self):\n",
" return self.length\n",
" \n",
" def __iter__(self):\n",
" return self.CardDeckIterator(self.length)\n",
" \n",
" def __reversed__(self):\n",
" return self.CardDeckIterator(self.length, reverse=True)\n",
" \n",
" class CardDeckIterator:\n",
" def __init__(self, length, *, reverse=False):\n",
" self.length = length\n",
" self.reverse = reverse\n",
" self.i = 0\n",
" \n",
" def __iter__(self):\n",
" return self\n",
" \n",
" def __next__(self):\n",
" if self.i >= self.length:\n",
" raise StopIteration\n",
" else:\n",
" if self.reverse:\n",
" index = self.length -1 - self.i\n",
" else:\n",
" index = self.i\n",
" suit = _SUITS[index // len(_RANKS)]\n",
" rank = _RANKS[index % len(_RANKS)]\n",
" self.i += 1\n",
" return Card(rank, suit)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Card(rank=2, suit='Spades')\n",
"Card(rank=3, suit='Spades')\n",
"Card(rank=4, suit='Spades')\n",
"Card(rank=5, suit='Spades')\n",
"Card(rank=6, suit='Spades')\n",
"Card(rank=7, suit='Spades')\n",
"Card(rank=8, suit='Spades')\n",
"Card(rank=9, suit='Spades')\n",
"Card(rank=10, suit='Spades')\n",
"Card(rank='J', suit='Spades')\n",
"Card(rank='Q', suit='Spades')\n",
"Card(rank='K', suit='Spades')\n",
"Card(rank='A', suit='Spades')\n",
"Card(rank=2, suit='Hearts')\n",
"Card(rank=3, suit='Hearts')\n",
"Card(rank=4, suit='Hearts')\n",
"Card(rank=5, suit='Hearts')\n",
"Card(rank=6, suit='Hearts')\n",
"Card(rank=7, suit='Hearts')\n",
"Card(rank=8, suit='Hearts')\n",
"Card(rank=9, suit='Hearts')\n",
"Card(rank=10, suit='Hearts')\n",
"Card(rank='J', suit='Hearts')\n",
"Card(rank='Q', suit='Hearts')\n",
"Card(rank='K', suit='Hearts')\n",
"Card(rank='A', suit='Hearts')\n",
"Card(rank=2, suit='Diamonds')\n",
"Card(rank=3, suit='Diamonds')\n",
"Card(rank=4, suit='Diamonds')\n",
"Card(rank=5, suit='Diamonds')\n",
"Card(rank=6, suit='Diamonds')\n",
"Card(rank=7, suit='Diamonds')\n",
"Card(rank=8, suit='Diamonds')\n",
"Card(rank=9, suit='Diamonds')\n",
"Card(rank=10, suit='Diamonds')\n",
"Card(rank='J', suit='Diamonds')\n",
"Card(rank='Q', suit='Diamonds')\n",
"Card(rank='K', suit='Diamonds')\n",
"Card(rank='A', suit='Diamonds')\n",
"Card(rank=2, suit='Clubs')\n",
"Card(rank=3, suit='Clubs')\n",
"Card(rank=4, suit='Clubs')\n",
"Card(rank=5, suit='Clubs')\n",
"Card(rank=6, suit='Clubs')\n",
"Card(rank=7, suit='Clubs')\n",
"Card(rank=8, suit='Clubs')\n",
"Card(rank=9, suit='Clubs')\n",
"Card(rank=10, suit='Clubs')\n",
"Card(rank='J', suit='Clubs')\n",
"Card(rank='Q', suit='Clubs')\n",
"Card(rank='K', suit='Clubs')\n",
"Card(rank='A', suit='Clubs')\n"
]
}
],
"source": [
"for card in CardDeck():\n",
" print(card)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Card(rank='A', suit='Clubs')\n",
"Card(rank='K', suit='Clubs')\n",
"Card(rank='Q', suit='Clubs')\n",
"Card(rank='J', suit='Clubs')\n",
"Card(rank=10, suit='Clubs')\n",
"Card(rank=9, suit='Clubs')\n",
"Card(rank=8, suit='Clubs')\n",
"Card(rank=7, suit='Clubs')\n",
"Card(rank=6, suit='Clubs')\n",
"Card(rank=5, suit='Clubs')\n",
"Card(rank=4, suit='Clubs')\n",
"Card(rank=3, suit='Clubs')\n",
"Card(rank=2, suit='Clubs')\n",
"Card(rank='A', suit='Diamonds')\n",
"Card(rank='K', suit='Diamonds')\n",
"Card(rank='Q', suit='Diamonds')\n",
"Card(rank='J', suit='Diamonds')\n",
"Card(rank=10, suit='Diamonds')\n",
"Card(rank=9, suit='Diamonds')\n",
"Card(rank=8, suit='Diamonds')\n",
"Card(rank=7, suit='Diamonds')\n",
"Card(rank=6, suit='Diamonds')\n",
"Card(rank=5, suit='Diamonds')\n",
"Card(rank=4, suit='Diamonds')\n",
"Card(rank=3, suit='Diamonds')\n",
"Card(rank=2, suit='Diamonds')\n",
"Card(rank='A', suit='Hearts')\n",
"Card(rank='K', suit='Hearts')\n",
"Card(rank='Q', suit='Hearts')\n",
"Card(rank='J', suit='Hearts')\n",
"Card(rank=10, suit='Hearts')\n",
"Card(rank=9, suit='Hearts')\n",
"Card(rank=8, suit='Hearts')\n",
"Card(rank=7, suit='Hearts')\n",
"Card(rank=6, suit='Hearts')\n",
"Card(rank=5, suit='Hearts')\n",
"Card(rank=4, suit='Hearts')\n",
"Card(rank=3, suit='Hearts')\n",
"Card(rank=2, suit='Hearts')\n",
"Card(rank='A', suit='Spades')\n",
"Card(rank='K', suit='Spades')\n",
"Card(rank='Q', suit='Spades')\n",
"Card(rank='J', suit='Spades')\n",
"Card(rank=10, suit='Spades')\n",
"Card(rank=9, suit='Spades')\n",
"Card(rank=8, suit='Spades')\n",
"Card(rank=7, suit='Spades')\n",
"Card(rank=6, suit='Spades')\n",
"Card(rank=5, suit='Spades')\n",
"Card(rank=4, suit='Spades')\n",
"Card(rank=3, suit='Spades')\n",
"Card(rank=2, suit='Spades')\n"
]
}
],
"source": [
"for card in reversed(CardDeck()):\n",
" print(card)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment