{ "cells": [ { "cell_type": "markdown", "source": [ "# Fibonacci\n", "\n", "[フィボナッチ数](https://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A3%E3%83%9C%E3%83%8A%E3%83%83%E3%83%81%E6%95%B0)\n", "\n", "1. テストファースト\n", "1. アサートファースト\n", "1. 仮実装\n", "1. 三角測量\n", "1. 明白な実装\n", "1. リファクタリング" ], "metadata": { "collapsed": false } }, { "cell_type": "markdown", "source": [ "## テストファースト" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n", "is_executing": false } } }, { "cell_type": "code", "source": [ "import unittest\n", "class FibonacciTest(unittest.TestCase):\n", " pass\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } }, "execution_count": 21, "outputs": [ { "name": "stderr", "text": [ "\n----------------------------------------------------------------------\nRan 0 tests in 0.000s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 21 } ] }, { "cell_type": "markdown", "source": [ "## アサートファースト" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 22, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 22 } ], "source": [ "import unittest\n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## 仮実装" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 23, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 23 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " return 0\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## 三角測量" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 24, "outputs": [ { "name": "stderr", "text": [ "F", "\n======================================================================\nFAIL: test_function (__main__.FibonacciTest)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n File \"\", line 10, in test_function\n self.assertEqual(fib(1),1)\nAssertionError: 0 != 1\n\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nFAILED (failures=1)\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 24 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " return 0\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " self.assertEqual(fib(1),1)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## 明白な実装" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 25, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 25 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " result = n\n", " if n == 0:\n", " result = 0\n", " return result\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " self.assertEqual(fib(1),1)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 26, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 26 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " result = n\n", " if n == 0:\n", " result = 0\n", " elif n == 1:\n", " result = 1\n", " else:\n", " result = (n - 2) + (n -1)\n", " return result\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " self.assertEqual(fib(1),1)\n", " self.assertEqual(fib(2),1)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 27, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 27 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " result = n\n", " if n == 0:\n", " result = 0\n", " elif n == 1:\n", " result = 1\n", " else:\n", " result = fib(n - 2) + fib(n -1)\n", " return result\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " self.assertEqual(fib(1),1)\n", " self.assertEqual(fib(2),1)\n", " self.assertEqual(fib(3),2)\n", " self.assertEqual(fib(4),3)\n", " self.assertEqual(fib(10),55)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "markdown", "source": [ "## リファクタリング" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 28, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 28 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " if n == 0: return 0\n", " if n == 1: return 1\n", " return fib(n - 2) + fib(n -1)\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " self.assertEqual(fib(1),1)\n", " self.assertEqual(fib(2),1)\n", " self.assertEqual(fib(3),2)\n", " self.assertEqual(fib(4),3)\n", " self.assertEqual(fib(10),55)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 29, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 29 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " next = lambda n: fib(n - 2) + fib(n -1)\n", " if n == 0: return 0\n", " if n == 1: return 1\n", " return next(n)\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " self.assertEqual(fib(1),1)\n", " self.assertEqual(fib(2),1)\n", " self.assertEqual(fib(3),2)\n", " self.assertEqual(fib(4),3)\n", " self.assertEqual(fib(10),55)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 30, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 30 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " next = lambda n: fib(n - 2) + fib(n -1)\n", " if n == 0: return 0\n", " if n == 1: return 1\n", " return next(n)\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " test_patterns = [\n", " (0,0),\n", " (1,1),\n", " (2,1),\n", " (3,2),\n", " (4,3),\n", " (10,55)\n", " ]\n", "\n", " for arge, expect in test_patterns:\n", " self.assertEqual(fib(arge), expect)\n", " \n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "execution_count": 31, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 31 } ], "source": [ "import unittest\n", "\n", "def fib(n):\n", " next = lambda n: fib(n - 2) + fib(n -1)\n", " if n == 0: return 0\n", " if n == 1: return 1\n", " return next(n)\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " test_patterns = [\n", " (0,0),\n", " (1,1),\n", " (2,1),\n", " (3,2),\n", " (4,3),\n", " (10,55)\n", " ]\n", " for arge, expect in test_patterns:\n", " with self.subTest(arge=arge, expect=expect):\n", " self.assertEqual(fib(arge), expect)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } }, { "cell_type": "code", "source": [ "import unittest\n", "\n", "def fib(n):\n", " next = lambda n: fib(n - 2) + fib(n -1)\n", " if n == 0: return 0\n", " if n == 1: return 1\n", " return next(n)\n", " \n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " test_patterns = [\n", " (0,0),\n", " (1,1),\n", " (2,1),\n", " (3,2),\n", " (4,3),\n", " (10,55)\n", " ]\n", " for arge, expect in test_patterns:\n", " with self.subTest(arge=arge, expect=expect):\n", " self.assertEqual(fib(arge), expect)\n", "\n", "unittest.main(argv=[''],exit=False)" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% \n", "is_executing": false } }, "execution_count": 32, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.001s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 32 } ] }, { "cell_type": "code", "execution_count": 45, "outputs": [ { "name": "stderr", "text": [ ".", "\n----------------------------------------------------------------------\nRan 1 test in 0.002s\n\nOK\n" ], "output_type": "stream" }, { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 45 } ], "source": [ "import unittest\n", "class FibonacciTest(unittest.TestCase):\n", " def test_function(self):\n", " self.assertEqual(fib(0),0)\n", " \n", "unittest.main(argv=[''],exit=False)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": false } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } } }, "nbformat": 4, "nbformat_minor": 0 }