{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 数を扱う" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 基本数学演習" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ".....\n", "----------------------------------------------------------------------\n", "Ran 5 tests in 0.003s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "\n", "class TestArithmeticOperations(unittest.TestCase):\n", " def test_addtion(self):\n", " self.assertEqual(1 + 2, 3)\n", " self.assertEqual(1 + 3.5, 4.5)\n", " self.assertEqual(-1 + 2.5, 1.5)\n", " self.assertEqual(-1.1 + 5, 3.9)\n", " \n", " def test_subtract(self):\n", " self.assertEqual(100 - 45, 55)\n", " \n", " def test_multipliction(self):\n", " self.assertEqual(3 * 2, 6)\n", " self.assertEqual(3.5 * 1.5, 5.25)\n", " self.assertEqual(2 ** 2, 4)\n", " self.assertEqual(2 ** 10, 1024)\n", " self.assertEqual(1 ** 10, 1)\n", " self.assertEqual(8 ** (1 / 3), 2.0)\n", " \n", " def test_division(self):\n", " self.assertEqual(3 / 2, 1.5)\n", " self.assertEqual(4 / 2, 2)\n", " self.assertEqual(3 // 2, 1)\n", " self.assertEqual(-3 // 2, -2)\n", " self.assertEqual(9 % 2, 1)\n", " \n", " def test_muliti_operation(self):\n", " self.assertEqual(5 + 5 * 5, 30)\n", " self.assertEqual((5 + 5) * 5, 50)\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ラベル:名前に数を割り当てる" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "......\n", "----------------------------------------------------------------------\n", "Ran 6 tests in 0.004s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "\n", "class TestLabelOperations(unittest.TestCase):\n", " def test_addition(self):\n", " a = 3\n", " self.assertEqual(a + 1, 4)\n", " a = 5\n", " self.assertEqual(a + 1, 6)\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 様々な種類の数" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "........\n", "----------------------------------------------------------------------\n", "Ran 8 tests in 0.006s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "\n", "class TestNumberType(unittest.TestCase):\n", " def test_int(self):\n", " assert type(3) is int\n", " assert type(int(3.8)) is int\n", " assert type(int(3.0)) is int\n", "\n", " def test_float(self):\n", " assert type(3.5) is float\n", " assert type(3.0) is float\n", " assert type(float(3)) is float\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 分数を扱う" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "...........\n", "----------------------------------------------------------------------\n", "Ran 11 tests in 0.007s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "from fractions import Fraction\n", "\n", "\n", "class TestFraction(unittest.TestCase):\n", " def test_01(self):\n", " f = Fraction(3, 4)\n", " self.assertEqual(f, 3 / 4)\n", "\n", " def test_02(self):\n", " f = Fraction(3, 4) + 1 + 1.5\n", " self.assertEqual(f, 3.25)\n", "\n", " def test_03(self):\n", " f = Fraction(3, 4) + 1 + Fraction(1 / 4)\n", " self.assertEqual(f, 2 / 1)\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 複素数" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "................\n", "----------------------------------------------------------------------\n", "Ran 16 tests in 0.010s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "\n", "class TestComplexNumber(unittest.TestCase):\n", " def test_01(self):\n", " a = 2 + 3j\n", " assert type(a) is complex\n", " \n", " def test_02(self):\n", " a = complex(2, 3)\n", " self.assertEqual(a, 2+3j)\n", " \n", " def test_03(self):\n", " a = complex(2, 3)\n", " b = 3 + 3j\n", " self.assertEqual(a + b, 5+6j)\n", " \n", " def test_04(self):\n", " a = complex(2, 3)\n", " b = 3 + 3j\n", " self.assertEqual(a * b, -3+15j)\n", " self.assertEqual(a/b, 0.8333333333333334+0.16666666666666666j)\n", " \n", " def test_05(self):\n", " z = 2 + 3j\n", " self.assertEqual(z.real, 2.0)\n", " self.assertEqual(z.imag, 3.0)\n", " self.assertEqual(z.conjugate(), 2-3j)\n", " self.assertEqual((z.real ** 2 + z.imag ** 2)**0.5, 3.605551275463989)\n", " self.assertEqual(abs(z), 3.605551275463989) \n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 例外と不当入力の処理" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ ".................." ] }, { "name": "stdout", "output_type": "stream", "text": [ "An invalid number\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "----------------------------------------------------------------------\n", "Ran 18 tests in 0.013s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "\n", "def exception(number):\n", " try:\n", " a = float(number)\n", " print(a)\n", " except ValueError:\n", " print('An invalid number')\n", " raise ValueError\n", "\n", "\n", "class TestException(unittest.TestCase):\n", " def test_01(self):\n", " with self.assertRaises(ValueError):\n", " exception('Hoge')\n", "\n", " def test_02(self):\n", " self.assertFalse(1.1.is_integer())\n", " self.assertTrue(1.0.is_integer())\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 分数と複素数を入力" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "..................\n", "----------------------------------------------------------------------\n", "Ran 18 tests in 0.011s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "from fractions import Fraction\n", "\n", "\n", "def exception2(number):\n", " try:\n", " a = Fraction(number)\n", " print(a)\n", " except ZeroDivisionError:\n", " print('An invalid number')\n", " raise ZeroDivisionError\n", "\n", "\n", "def exception3(number):\n", " try:\n", " a = complex(number)\n", " print(a)\n", " except ZeroDivisionError:\n", " print('An invalid number')\n", " raise ZeroDivisionError\n", "\n", "\n", "class TestException(unittest.TestCase): \n", " def test_01(self):\n", " with self.assertRaises(ZeroDivisionError):\n", " exception2(3/0)\n", " \n", " def test_02(self):\n", " with self.assertRaises(ValueError):\n", " exception3('2 + 3j')\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数学を行うプログラムを書く" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 整数の因数を計算する\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "...................." ] }, { "name": "stdout", "output_type": "stream", "text": [ "1\n", "5\n", "25\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "----------------------------------------------------------------------\n", "Ran 20 tests in 0.013s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "\n", "'''\n", "0を除く整数aが別の整数bの因数か調べる\n", "'''\n", "def is_factor(a, b):\n", " if b % a == 0:\n", " return True\n", " else:\n", " return False\n", "\n", "\n", "'''\n", "整数の因数を見つける\n", "'''\n", "def factors(b):\n", " arr = []\n", "\n", " for i in range(1, b + 1):\n", " if b % i == 0:\n", " print(i)\n", " arr.append(i)\n", "\n", " return arr\n", "\n", "\n", "class TestFactor(unittest.TestCase):\n", " def test_01(self):\n", " self.assertTrue(is_factor(4, 1024))\n", " \n", " def test_02(self):\n", " self.assertEqual(factors(25),[1,5,25])\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 乗算表を生成する" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "....................." ] }, { "name": "stdout", "output_type": "stream", "text": [ "1\n", "5\n", "25\n", "5 x 1 = 5\n", "5 x 2 = 10\n", "5 x 3 = 15\n", "5 x 4 = 20\n", "5 x 5 = 25\n", "5 x 6 = 30\n", "5 x 7 = 35\n", "5 x 8 = 40\n", "5 x 9 = 45\n", "5 x 10 = 50\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "----------------------------------------------------------------------\n", "Ran 21 tests in 0.017s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "'''\n", "乗算表生成器\n", "'''\n", "def multi_table(a):\n", " arr = []\n", " for i in range(1, 11):\n", " msg = '{0} x {1} = {2}'.format(a, i, a * i)\n", " print(msg)\n", " arr.append(msg)\n", "\n", " return arr\n", "\n", "class TestMultiTable(unittest.TestCase):\n", " def test_01(self):\n", " expect = ['5 x 1 = 5',\n", " '5 x 2 = 10',\n", " '5 x 3 = 15',\n", " '5 x 4 = 20',\n", " '5 x 5 = 25',\n", " '5 x 6 = 30',\n", " '5 x 7 = 35',\n", " '5 x 8 = 40',\n", " '5 x 9 = 45',\n", " '5 x 10 = 50']\n", " self.assertEqual(multi_table(5), expect)\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 測定単位を変換する" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "......................." ] }, { "name": "stdout", "output_type": "stream", "text": [ "1\n", "5\n", "25\n", "5 x 1 = 5\n", "5 x 2 = 10\n", "5 x 3 = 15\n", "5 x 4 = 20\n", "5 x 5 = 25\n", "5 x 6 = 30\n", "5 x 7 = 35\n", "5 x 8 = 40\n", "5 x 9 = 45\n", "5 x 10 = 50\n", "Distance in miles: 100.0\n", "Distance in kilometers: 160.9\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "----------------------------------------------------------------------\n", "Ran 23 tests in 0.014s\n", "\n", "OK\n" ] } ], "source": [ "import unittest\n", "\n", "'''\n", "単位換算プログラム\n", "'''\n", "def km_miles(arg):\n", " km = float(arg)\n", " miles = km / 1.609\n", " msg = 'Distance in miles: {0}'.format(miles)\n", " print(msg)\n", " return miles\n", "\n", "\n", "def miles_km(arg):\n", " miles = float(arg)\n", " km = miles * 1.609\n", " msg = 'Distance in kilometers: {0}'.format(km)\n", " print(msg)\n", " return km\n", "\n", "\n", "class TestUnitConverter(unittest.TestCase):\n", " def test_01(self):\n", " self.assertEqual(km_miles(160.9), 100)\n", "\n", " def test_02(selfs):\n", " selfs.assertEqual(miles_km(100), 160.9)\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2次方程式の解を求める\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$x_1 = {-b + \\sqrt{b^2-fac} \\over 2a}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$x_2 = {-b - \\sqrt{b^2-fac} \\over 2a}$" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "........................." ] }, { "name": "stdout", "output_type": "stream", "text": [ "1\n", "5\n", "25\n", "5 x 1 = 5\n", "5 x 2 = 10\n", "5 x 3 = 15\n", "5 x 4 = 20\n", "5 x 5 = 25\n", "5 x 6 = 30\n", "5 x 7 = 35\n", "5 x 8 = 40\n", "5 x 9 = 45\n", "5 x 10 = 50\n", "x1: -1.0\n", "x2: -1.0\n", "x1: (-0.49999999999999994+0.8660254037844386j)\n", "x2: (-0.5-0.8660254037844386j)\n", "Distance in miles: 100.0\n", "Distance in kilometers: 160.9\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n", "----------------------------------------------------------------------\n", "Ran 25 tests in 0.014s\n", "\n", "OK\n" ] } ], "source": [ "\n", "import unittest\n", "\n", "\n", "'''\n", "2次方程式求解電卓\n", "'''\n", "def roots(a, b, c):\n", " arr = []\n", " D = (b*b - 4*a*c)**0.5\n", " x_1 = (-b + D)/(2*a)\n", " x_2 = (-b - D)/(2*a)\n", " print('x1: {0}'.format(x_1))\n", " print('x2: {0}'.format(x_2))\n", " return x_1,x_2\n", "\n", "\n", "class TestRoots(unittest.TestCase):\n", " def test_01(self):\n", " self.assertEqual(roots(1,2,1),(-1.0,-1.0))\n", " \n", " def test_02(self):\n", " self.assertEqual(roots(1,1,1),(-0.49999999999999994+0.8660254037844386j,-0.5-0.8660254037844386j))\n", "\n", "\n", "\n", "\n", "\n", "\n", "if __name__ == '__main__':\n", " unittest.main(argv=['first-arg-is-ignored'], exit=False)\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.7.0" } }, "nbformat": 4, "nbformat_minor": 1 }