{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2023年度計算機演習A・B\n",
    "\n",
    "# 第3回：Python入門3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 0. 変数名に関する注意（前回の補足）\n",
    "\n",
    "前回の授業資料で変数の命名ルールについて扱いましたが、変数名として使用できない予約語（キーワード）の一覧は次のようになっています。予約語を変数名として使おうとすると、エラーが発生します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import keyword\n",
    "print(len(keyword.kwlist))\n",
    "print(keyword.kwlist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "他の命名ルールに従ってさえいればこれらの予約語以外は何でも使用可能ではありますが、なるべく変数名としての使用を避けるべきものもあります。それは、組み込み関数（Pythonにおいて標準で用意されている関数）の名前です。\n",
    "\n",
    "次のリンクから、組み込み関数の一覧を確認することができます。https://docs.python.org/ja/3.8/library/functions.html\n",
    "\n",
    "組み込み関数の名前を変数名として使った場合にエラーや警告の表示は無く、関数としての役割が上書きされてそれ以降は関数としての使用ができなくなります。特にlist、max、min、range、sumなどは気付かずに変数名として使いがちですので、注意しましょう。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. if文による条件分岐\n",
    "\n",
    "### 1.1. if文の基本\n",
    "\n",
    "プログラムの中で条件分岐を行いたい場合には、if文を使います。\n",
    "\n",
    "if文の最も基本的な書き方は、次の通りです。\n",
    "\n",
    "```\n",
    "if 条件式:\n",
    "    条件式が真の場合の処理\n",
    "    …\n",
    "```\n",
    "\n",
    "前回説明したfor文と同様に、if文のブロックに含めるべき行は行頭にインデント（\\[Tab\\]または半角スペース4個）を入れる必要があります。ただし、JupyterLabでNotebookを扱う限りは、コロンの後で改行をするとインデントが自動的に入力されるようです。逆に、if文のブロックに含めるべきでない行は、行頭のインデントを消さなくてはなりません（\\[BackSpace\\]）。\n",
    "\n",
    "ほとんどのプログラミング言語ではインデントはただのマナーですが、**Pythonではインデントの有無がコードの実行に影響します。**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random  #importの説明は後で行う\n",
    "a = random.randint(0,100)  #0以上100以下のランダムな整数を与える\n",
    "print(a)\n",
    "\n",
    "if a >= 60:\n",
    "    print(\"合格\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（\\[Ctrl\\]+\\[Enter\\]を使うと、セルの移動を伴わずにコードの実行ができます。同じセルを複数回実行する際に便利です。）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2. 条件式の書き方\n",
    "\n",
    "条件式は、その真偽に応じてTrueまたはFalse（真理値型のオブジェクト）を値に取ります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(1 < 2)\n",
    "print(type(1 < 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "条件式で使用できる関係演算子（比較演算子）は、次の表の通りです。\n",
    "\n",
    "| 関係演算子 | 意味 |\n",
    "| :---: | :---: |\n",
    "| == | 等しい |\n",
    "| != | 等しくない |\n",
    "| >= | 以上 |\n",
    "| > | より大きい |\n",
    "| <= | 以下 |\n",
    "| < | より小さい |\n",
    "\n",
    "条件式で使用できる論理演算子は、次の表の通りです。\n",
    "\n",
    "| 論理演算子 | 意味 |\n",
    "| :---: | :---: |\n",
    "| and | かつ |\n",
    "| or | または |\n",
    "| not | でない |\n",
    "\n",
    "複数の論理演算子を併用する場合は、必要に応じて演算の優先順位を変えるために半角の括弧を使います。\n",
    "\n",
    "次のコードに示すように、Pythonでは数学で使用するような連結した等式・不等式をそのまま書くことができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 3\n",
    "\n",
    "if 1 < a and a < 5:  #多くのプログラミング言語での書き方\n",
    "    print(\"真\")\n",
    "\n",
    "if 1 < a < 5:  #Pythonではこのような書き方も可能\n",
    "    print(\"真\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3. elseとelifの使用\n",
    "\n",
    "if文ではオプションとして、次のようにelseとelif（else ifに由来）を使うことができます。elifは複数個の使用も可能です。\n",
    "\n",
    "```\n",
    "if 条件式:\n",
    "    条件式が真の場合の処理\n",
    "    …\n",
    "else:\n",
    "    条件式が偽の場合の処理\n",
    "    …\n",
    "```\n",
    "\n",
    "```\n",
    "if 条件式1:\n",
    "    条件式1が真の場合の処理\n",
    "    …\n",
    "elif 条件式2:\n",
    "    条件式1が偽かつ条件式2が真の場合の処理\n",
    "    …\n",
    "else:\n",
    "    条件式1が偽かつ条件式2が偽の場合の処理\n",
    "    …\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "if文を使って、点数（0以上100以下の整数）が与えられたときに次の表に従った評価を表示するコードを書いてください。\n",
    "\n",
    "| 点数 | 評価 |\n",
    "| :---: | :---: |\n",
    "| 90点～100点 | 秀 |\n",
    "| 80点～89点 | 優 |\n",
    "| 70点～79点 | 良 |\n",
    "| 60点～69点 | 可 |\n",
    "| 0点～59点 | 不可 |"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習1のコード\n",
    "import random\n",
    "score = random.randint(0,100)  #0以上100以下のランダムな整数を与える\n",
    "print(score)\n",
    "\n",
    "#ここに、if文を使ったコードを書いてください"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. while文による繰り返し\n",
    "\n",
    "### 2.1. while文の書き方\n",
    "\n",
    "プログラムの中で特定の処理をある条件が成り立つ間繰り返したい場合には、while文を使います。\n",
    "\n",
    "while文の書き方は、次の通りです。\n",
    "\n",
    "```\n",
    "while 条件式:\n",
    "    条件式が真の間繰り返して行う処理\n",
    "    …\n",
    "```\n",
    "\n",
    "ここで、「条件式」はif文と同じように書けばよいです。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = 0\n",
    "n = 0\n",
    "\n",
    "while result < 100:\n",
    "    n = n+1\n",
    "    result = result+n\n",
    "\n",
    "print(\"条件「1からnまでの整数の和が100以上」を満たす最小のnは\",n)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2. 無限ループ\n",
    "\n",
    "while文がfor文と最も違うのは、繰り返しの回数が不定であることです。場合によっては無限ループ（繰り返しがいつまでも終わらない状態）が発生してしまうため、十分に注意する必要があります。\n",
    "\n",
    "もし無限ループに陥ってしまった場合は、画面上の四角ボタンでカーネルの中断を試み、それがダメなら丸い矢印のボタンでカーネルを再起動すればよいです。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "while文を使って、条件「nの階乗が5000以上」を満たす最小のnとその階乗の値を求めてください。ただし、階乗を求める関数を使わないこと。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習2のコード\n",
    "\n",
    "#ここに、while文を使ったコードを書いてください\n",
    "#上のコードが参考になるはずです"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. ライブラリの使用と数学関数\n",
    "\n",
    "### 3.1. ライブラリとは\n",
    "\n",
    "Pythonにおけるライブラリとは、「Pythonの機能拡張のために用意されたプログラムの集まり」のことです。様々なライブラリを使用することで、組み込み関数以外にも多くの便利な関数が使えるようになります。\n",
    "\n",
    "※ライブラリの類語として、モジュールとパッケージがあります。ここではこれらの厳密な違いには触れません。\n",
    "\n",
    "あるライブラリに含まれる関数を使用したい場合は、\n",
    "\n",
    "```\n",
    "import ライブラリ名\n",
    "```\n",
    "\n",
    "として該当のライブラリをインポートした上で、`ライブラリ名.関数名`のようにして使います。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random  #randomというライブラリをインポートする\n",
    "a = random.randint(0,100)  #randintという関数が使用できるようになる\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ただし、import文を書けばどのライブラリでも使えるというわけではなく、プログラムの実行環境に事前にインストールされたもののみが使用可能です。CESのプログラミング機能では、メジャーなものは概ね使えるようになっています。\n",
    "\n",
    "※厳密には、ライブラリは標準ライブラリと外部ライブラリに分けられます。前者はPython自体に付属しているためインストールなしに使えるもので、後者は事前のインストールが必要です。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2. mathライブラリと数学関数\n",
    "\n",
    "mathという標準ライブラリには、数学的な計算をするための様々な関数が集められています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "\n",
    "print(math.pi)  #円周率\n",
    "print(math.e)   #ネイピア数\n",
    "\n",
    "print()  #空行\n",
    "\n",
    "x = math.pi/3\n",
    "print(math.sin(x))  #三角関数sin\n",
    "print(math.cos(x))  #三角関数cos\n",
    "print(math.tan(x))  #三角関数tan\n",
    "\n",
    "print()  #空行\n",
    "\n",
    "x = 2\n",
    "print(math.sqrt(x))   #平方根\n",
    "print(math.exp(x))    #eを底とする指数関数\n",
    "print(math.pow(3,x))  #第1引数を底とする指数関数\n",
    "print(math.log(x))    #eを底とする対数関数\n",
    "print(math.log(x,4))  #第2引数を底とする対数関数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 関数の定義\n",
    "\n",
    "### 4.1. 関数とは\n",
    "\n",
    "これまでにも関数という言葉を度々使ってきましたが、プログラミングにおける関数とは「与えられた値（引数）に対して特定の処理を行ってその結果（戻り値）を返す」ような命令のことです。ただし、引数あるいは戻り値が無い関数も存在します。\n",
    "\n",
    "次のコードでは、いくつかの組み込み関数を使用しています。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = -5\n",
    "print(abs(x))  #絶対値\n",
    "\n",
    "y = [2,-4,8,-16]\n",
    "print(sum(y))  #リストの要素の合計\n",
    "print(min(y))  #リストの要素の最小値\n",
    "print(max(y))  #リストの要素の最大値"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2. 関数定義の方法\n",
    "\n",
    "Pythonでは、ユーザー自らが新しい関数を定義することができます。\n",
    "\n",
    "関数定義の基本的な書き方は、次の通りです。\n",
    "\n",
    "```\n",
    "def 関数名(引数1,引数2,…):\n",
    "    関数の処理\n",
    "    …\n",
    "    return 戻り値\n",
    "```\n",
    "\n",
    "for文、if文、while文と同様に、def文でもインデントが重要です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def my_abs(x):  #絶対値を求める関数を自分で定義する\n",
    "    if x >= 0:\n",
    "        result = x\n",
    "    else:\n",
    "        result = -x\n",
    "    return result\n",
    "\n",
    "print(my_abs(3))  #定義した関数を呼び出す\n",
    "print(my_abs(-5))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "引数あるいは戻り値が無い関数も定義可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "\n",
    "def janken():  #引数が無い関数\n",
    "    a = random.randint(1,3)\n",
    "    if a == 1:\n",
    "        result = \"グー\"\n",
    "    elif a == 2:\n",
    "        result = \"チョキ\"\n",
    "    else:\n",
    "        result = \"パー\"\n",
    "    return result\n",
    "\n",
    "print(janken())\n",
    "print(janken())\n",
    "print(janken())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hello(name):  #戻り値が無い関数\n",
    "    print(\"Hello, \"+name+\"!\")\n",
    "\n",
    "hello(\"World\")\n",
    "hello(\"Taro\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習3\n",
    "\n",
    "任意の3つの数に対してそれらの最小値を返す関数my_min3を定義してください。ただし、関数minおよびmaxを使わないこと。定義した関数を呼び出す例も付けてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習3のコード\n",
    "def my_min3(a,b,c):\n",
    "    #ここに、関数の処理を書いてください\n",
    "    #passはエラーを防ぐために書いている「何もしない文」ですので、消してください\n",
    "    pass\n",
    "\n",
    "#関数を呼び出す例を付けてください"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習4（オプション）\n",
    "\n",
    "任意の複数の数からなるリストに対してその要素の最大値を返す関数my_maxを定義してください。ただし、関数maxおよびminを使わないこと。定義した関数を呼び出す例も付けてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#演習4のコード\n",
    "def my_max(num_list):\n",
    "    #ここに、関数の処理を書いてください\n",
    "    #passはエラーを防ぐために書いている「何もしない文」ですので、消してください\n",
    "    pass\n",
    "\n",
    "#関数を呼び出す例を付けてください"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第3回レポート課題\n",
    "\n",
    "演習1～演習4に取り組んでください。"
   ]
  }
 ],
 "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.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
