diff --git a/01-data-model/.ipynb_checkpoints/prac-checkpoint.ipynb b/01-data-model/.ipynb_checkpoints/prac-checkpoint.ipynb new file mode 100644 index 0000000..67d3ce6 --- /dev/null +++ b/01-data-model/.ipynb_checkpoints/prac-checkpoint.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import collections\n", + "\n", + "Card = collections.namedtuple('Card', ['rank', 'suit'])\n", + "\n", + "class FrenchDeck:\n", + " ranks = [str(n) for n in range(2, 11)] + list('JQKA')\n", + " suits = 'spades diamonds clubs hearts'.split()\n", + "\n", + " def __init__(self):\n", + " self._cards = [Card(rank, suit) for suit in self.suits\n", + " for rank in self.ranks]\n", + "\n", + " def __len__(self):\n", + " return len(self._cards)\n", + "\n", + " def __getitem__(self, position):\n", + " return self._cards[position]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "52" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deck1=FrenchDeck()\n", + "len(deck1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We could select Aces by starting from 12, and then skipping 13 cards afterwards:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]\n" + ] + } + ], + "source": [ + "print(deck1[12::13])" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "suits=[str(n) for n in range(2, 11)] + list('JQKA')\n", + "ranks='spades diamonds clubs hearts'.split()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "deck2=[(rank, suit) for suit in suits for rank in ranks]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "from random import shuffle\n", + "print(shuffle(deck2))" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('clubs', '5'), ('hearts', '2'), ('spades', '2'), ('diamonds', '9'), ('diamonds', '5'), ('diamonds', 'A'), ('diamonds', '7'), ('diamonds', '8'), ('spades', '10'), ('diamonds', '2'), ('spades', 'K'), ('spades', '8'), ('diamonds', 'K'), ('spades', 'Q'), ('spades', '7'), ('diamonds', '4'), ('spades', '6'), ('hearts', 'J'), ('spades', '3'), ('spades', '4'), ('hearts', '6'), ('spades', '5'), ('clubs', 'A'), ('hearts', '8'), ('clubs', 'J'), ('hearts', '10'), ('spades', 'A'), ('clubs', '10'), ('clubs', '4'), ('hearts', '5'), ('clubs', '7'), ('clubs', 'Q'), ('diamonds', '6'), ('diamonds', '10'), ('spades', 'J'), ('hearts', '9'), ('clubs', '3'), ('hearts', 'K'), ('clubs', '6'), ('hearts', '7'), ('hearts', 'A'), ('clubs', 'K'), ('diamonds', '3'), ('hearts', '3'), ('diamonds', 'J'), ('clubs', '8'), ('hearts', '4'), ('clubs', '2'), ('spades', '9'), ('diamonds', 'Q'), ('hearts', 'Q'), ('clubs', '9')]\n" + ] + } + ], + "source": [ + "print(deck2)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('spades', 'K'), ('diamonds', 'K'), ('hearts', '6'), ('clubs', '3'), ('hearts', '7'), ('diamonds', 'Q'), ('diamonds', '7'), ('spades', 'A'), ('diamonds', '6'), ('diamonds', '8'), ('clubs', '2'), ('clubs', 'A'), ('diamonds', '5'), ('diamonds', 'J'), ('clubs', '5'), ('diamonds', '2'), ('spades', '7'), ('clubs', 'K'), ('spades', 'J'), ('hearts', '2'), ('spades', '2'), ('hearts', '9'), ('spades', '5'), ('diamonds', '10'), ('clubs', '9'), ('spades', '10'), ('clubs', '8'), ('spades', '3'), ('diamonds', '4'), ('clubs', '4'), ('clubs', '6'), ('spades', '8'), ('spades', '4'), ('spades', '9'), ('spades', 'Q'), ('hearts', 'Q'), ('clubs', '7'), ('spades', '6'), ('hearts', 'J'), ('hearts', '4'), ('hearts', 'A'), ('clubs', 'J'), ('diamonds', 'A'), ('clubs', '10'), ('hearts', '5'), ('hearts', '3'), ('diamonds', '9'), ('hearts', '8'), ('hearts', 'K'), ('diamonds', '3'), ('clubs', 'Q'), ('hearts', '10')]\n" + ] + } + ], + "source": [ + "shuffle(deck2)\n", + "print(deck2)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "board=deck2[4::5][0:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "hee=deck2[1::5][0:2]\n", + "john=deck2[2::5][0:2]\n", + "jieun=deck2[3::5][0:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([('diamonds', 'K'), ('diamonds', '7')],\n", + " [('hearts', '6'), ('spades', 'A')],\n", + " [('clubs', '3'), ('diamonds', '6')])" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hee,john,jieun" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('hearts', '7'), ('diamonds', '8'), ('clubs', '5')]" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "board" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('hearts', '7'),\n", + " ('diamonds', '8'),\n", + " ('clubs', '5'),\n", + " ('hearts', '2'),\n", + " ('clubs', '9')]" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deck2[4::5][0:5]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# made scores by probability\n" + ] + } + ], + "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.5.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/01-data-model/prac.ipynb b/01-data-model/prac.ipynb new file mode 100644 index 0000000..67d3ce6 --- /dev/null +++ b/01-data-model/prac.ipynb @@ -0,0 +1,268 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import collections\n", + "\n", + "Card = collections.namedtuple('Card', ['rank', 'suit'])\n", + "\n", + "class FrenchDeck:\n", + " ranks = [str(n) for n in range(2, 11)] + list('JQKA')\n", + " suits = 'spades diamonds clubs hearts'.split()\n", + "\n", + " def __init__(self):\n", + " self._cards = [Card(rank, suit) for suit in self.suits\n", + " for rank in self.ranks]\n", + "\n", + " def __len__(self):\n", + " return len(self._cards)\n", + "\n", + " def __getitem__(self, position):\n", + " return self._cards[position]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "52" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deck1=FrenchDeck()\n", + "len(deck1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We could select Aces by starting from 12, and then skipping 13 cards afterwards:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]\n" + ] + } + ], + "source": [ + "print(deck1[12::13])" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "suits=[str(n) for n in range(2, 11)] + list('JQKA')\n", + "ranks='spades diamonds clubs hearts'.split()" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "deck2=[(rank, suit) for suit in suits for rank in ranks]" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None\n" + ] + } + ], + "source": [ + "from random import shuffle\n", + "print(shuffle(deck2))" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('clubs', '5'), ('hearts', '2'), ('spades', '2'), ('diamonds', '9'), ('diamonds', '5'), ('diamonds', 'A'), ('diamonds', '7'), ('diamonds', '8'), ('spades', '10'), ('diamonds', '2'), ('spades', 'K'), ('spades', '8'), ('diamonds', 'K'), ('spades', 'Q'), ('spades', '7'), ('diamonds', '4'), ('spades', '6'), ('hearts', 'J'), ('spades', '3'), ('spades', '4'), ('hearts', '6'), ('spades', '5'), ('clubs', 'A'), ('hearts', '8'), ('clubs', 'J'), ('hearts', '10'), ('spades', 'A'), ('clubs', '10'), ('clubs', '4'), ('hearts', '5'), ('clubs', '7'), ('clubs', 'Q'), ('diamonds', '6'), ('diamonds', '10'), ('spades', 'J'), ('hearts', '9'), ('clubs', '3'), ('hearts', 'K'), ('clubs', '6'), ('hearts', '7'), ('hearts', 'A'), ('clubs', 'K'), ('diamonds', '3'), ('hearts', '3'), ('diamonds', 'J'), ('clubs', '8'), ('hearts', '4'), ('clubs', '2'), ('spades', '9'), ('diamonds', 'Q'), ('hearts', 'Q'), ('clubs', '9')]\n" + ] + } + ], + "source": [ + "print(deck2)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('spades', 'K'), ('diamonds', 'K'), ('hearts', '6'), ('clubs', '3'), ('hearts', '7'), ('diamonds', 'Q'), ('diamonds', '7'), ('spades', 'A'), ('diamonds', '6'), ('diamonds', '8'), ('clubs', '2'), ('clubs', 'A'), ('diamonds', '5'), ('diamonds', 'J'), ('clubs', '5'), ('diamonds', '2'), ('spades', '7'), ('clubs', 'K'), ('spades', 'J'), ('hearts', '2'), ('spades', '2'), ('hearts', '9'), ('spades', '5'), ('diamonds', '10'), ('clubs', '9'), ('spades', '10'), ('clubs', '8'), ('spades', '3'), ('diamonds', '4'), ('clubs', '4'), ('clubs', '6'), ('spades', '8'), ('spades', '4'), ('spades', '9'), ('spades', 'Q'), ('hearts', 'Q'), ('clubs', '7'), ('spades', '6'), ('hearts', 'J'), ('hearts', '4'), ('hearts', 'A'), ('clubs', 'J'), ('diamonds', 'A'), ('clubs', '10'), ('hearts', '5'), ('hearts', '3'), ('diamonds', '9'), ('hearts', '8'), ('hearts', 'K'), ('diamonds', '3'), ('clubs', 'Q'), ('hearts', '10')]\n" + ] + } + ], + "source": [ + "shuffle(deck2)\n", + "print(deck2)" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "board=deck2[4::5][0:3]" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "hee=deck2[1::5][0:2]\n", + "john=deck2[2::5][0:2]\n", + "jieun=deck2[3::5][0:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([('diamonds', 'K'), ('diamonds', '7')],\n", + " [('hearts', '6'), ('spades', 'A')],\n", + " [('clubs', '3'), ('diamonds', '6')])" + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hee,john,jieun" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('hearts', '7'), ('diamonds', '8'), ('clubs', '5')]" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "board" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[('hearts', '7'),\n", + " ('diamonds', '8'),\n", + " ('clubs', '5'),\n", + " ('hearts', '2'),\n", + " ('clubs', '9')]" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "deck2[4::5][0:5]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# made scores by probability\n" + ] + } + ], + "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.5.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/02-array-seq/.ipynb_checkpoints/Notebook2-checkpoint.ipynb b/02-array-seq/.ipynb_checkpoints/Notebook2-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/02-array-seq/.ipynb_checkpoints/Notebook2-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/02-array-seq/Notebook2.ipynb b/02-array-seq/Notebook2.ipynb new file mode 100644 index 0000000..adbf3d4 --- /dev/null +++ b/02-array-seq/Notebook2.ipynb @@ -0,0 +1,192 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DEMO: bisect\n", + "haystack -> 1 4 5 6 8 12 15 20 21 23 23 26 29 30\n", + "31 @ 14 | | | | | | | | | | | | | |31\n", + "30 @ 14 | | | | | | | | | | | | | |30\n", + "29 @ 13 | | | | | | | | | | | | |29\n", + "23 @ 11 | | | | | | | | | | |23\n", + "22 @ 9 | | | | | | | | |22\n", + "10 @ 5 | | | | |10\n", + " 8 @ 5 | | | | |8 \n", + " 5 @ 3 | | |5 \n", + " 2 @ 1 |2 \n", + " 1 @ 1 |1 \n", + " 0 @ 0 0 \n" + ] + } + ], + "source": [ + "# BEGIN BISECT_DEMO\n", + "import bisect\n", + "import sys\n", + "\n", + "HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]\n", + "NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]\n", + "\n", + "ROW_FMT = '{0:2d} @ {1:2d} {2}{0:<2d}'\n", + "\n", + "def demo(bisect_fn):\n", + " for needle in reversed(NEEDLES):\n", + " position = bisect_fn(HAYSTACK, needle) # <1>\n", + " offset = position * ' |' # <2>\n", + " print(ROW_FMT.format(needle, position, offset)) # <3>\n", + "\n", + "if __name__ == '__main__':\n", + "\n", + " if sys.argv[-1] == 'left': # <4>\n", + " bisect_fn = bisect.bisect_left\n", + " else:\n", + " bisect_fn = bisect.bisect\n", + "\n", + " print('DEMO:', bisect_fn.__name__) # <5>\n", + " print('haystack ->', ' '.join('%2d' % n for n in HAYSTACK))\n", + " demo(bisect_fn)\n", + "\n", + "# END BISECT_DEMO\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10 -> [10]\n", + " 0 -> [0, 10]\n", + " 6 -> [0, 6, 10]\n", + " 8 -> [0, 6, 8, 10]\n", + " 7 -> [0, 6, 7, 8, 10]\n", + " 2 -> [0, 2, 6, 7, 8, 10]\n", + "10 -> [0, 2, 6, 7, 8, 10, 10]\n" + ] + } + ], + "source": [ + "import bisect\n", + "import random\n", + "\n", + "SIZE = 7\n", + "\n", + "random.seed(1729)\n", + "\n", + "my_list = []\n", + "for i in range(SIZE):\n", + " new_item = random.randrange(SIZE*2)\n", + " bisect.insort(my_list, new_item)\n", + " print('%2d ->' % new_item, my_list)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "listcomp : 0.031 0.031 0.029\n", + "listcomp + func : 0.038 0.039 0.045\n", + "filter + lambda : 0.029 0.029 0.030\n", + "filter + func : 0.026 0.029 0.030\n" + ] + } + ], + "source": [ + "import timeit\n", + "\n", + "TIMES = 10000\n", + "\n", + "SETUP = \"\"\"\n", + "symbols = '$¢£¥€¤'\n", + "def non_ascii(c):\n", + " return c > 127\n", + "\"\"\"\n", + "\n", + "def clock(label, cmd):\n", + " res = timeit.repeat(cmd, setup=SETUP, number=TIMES)\n", + " print(label, *('{:.3f}'.format(x) for x in res))\n", + "\n", + "clock('listcomp :', '[ord(s) for s in symbols if ord(s) > 127]')\n", + "clock('listcomp + func :', '[ord(s) for s in symbols if non_ascii(ord(s))]')\n", + "clock('filter + lambda :', 'list(filter(lambda c: c > 127, map(ord, symbols)))')\n", + "clock('filter + func :', 'list(filter(non_ascii, map(ord, symbols)))')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " | lat. | long. \n", + "Mexico City | 19.4333 | -99.1333\n", + "New York-Newark | 40.8086 | -74.0204\n", + "Sao Paulo | -23.5478 | -46.6358\n" + ] + } + ], + "source": [ + "metro_areas = [\n", + " ('Tokyo', 'JP', 36.933, (35.689722, 139.691667)), # <1>\n", + " ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),\n", + " ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),\n", + " ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),\n", + " ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),\n", + "]\n", + "\n", + "print('{:15} | {:^9} | {:^9}'.format('', 'lat.', 'long.'))\n", + "fmt = '{:15} | {:9.4f} | {:9.4f}'\n", + "for name, cc, pop, (latitude, longitude) in metro_areas: # <2>\n", + " if longitude <= 0: # <3>\n", + " print(fmt.format(name, latitude, longitude))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "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.5.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/03-dict-set/.ipynb_checkpoints/Notebook3-checkpoint.ipynb b/03-dict-set/.ipynb_checkpoints/Notebook3-checkpoint.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/03-dict-set/.ipynb_checkpoints/Notebook3-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/03-dict-set/Notebook3.ipynb b/03-dict-set/Notebook3.ipynb new file mode 100644 index 0000000..2fd6442 --- /dev/null +++ b/03-dict-set/Notebook3.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/README.rst b/README.rst index 99a0ede..5cccee9 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,10 @@ -Fluent Python: example code +Fluent Python: example code with annotation by John Park =========================== +This repo is forked to study Fluent Python and annotate the code for future use and practice. + +============================ + Example code for the book `Fluent Python`_ by Luciano Ramalho (O'Reilly, 2014). **BEWARE**: This is a work in progress, like the book itself.