{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2023年度計算機演習A・B\n",
    "\n",
    "# 第2回：Python入門2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 0. 変数の命名ルール（前回の補足）\n",
    "\n",
    "前回の授業資料では、次のような説明をしました。\n",
    "\n",
    "> 変数の名前は、アルファベットと数字と「\\_」を組み合わせて複数文字にできます（ただし、一定のルールがあります）。\n",
    "\n",
    "この「一定のルール」について、内容を説明しておきます。\n",
    "\n",
    "- アルファベットの大文字と小文字は区別される。\n",
    "- 数字で始まってはいけない。\n",
    "- 予約語（プログラミング言語内で役割が決まっている単語）は使えない。例えば、`if`, `for`, `else`, `return`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 1\n",
    "A = 2\n",
    "print(a,A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#正しくない変数名の使用例\n",
    "0a = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#正しくない変数名の使用例\n",
    "if = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "変数の名前にはアルファベットの小文字を使い、必要なら区切り文字として「\\_」を入れることにすれば、基本的にはそれで十分です。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. オブジェクトの型\n",
    "\n",
    "### 1.1 オブジェクトの型とは\n",
    "\n",
    "Pythonでは、変数に代入する値などのデータのことをオブジェクトと呼びます。オブジェクトには多くの型（種類）があり、type関数を使うと型が何かを調べることができます。\n",
    "\n",
    "オブジェクトの型としては、例えば`int`：整数、`float`：小数（浮動小数点数）、`str`：文字列、`list`：リスト、`bool`：真理値、`dict`：辞書などがあります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 10\n",
    "b = 0.5\n",
    "c = \"abc\"\n",
    "d = [1,2,3]\n",
    "e = True\n",
    "f = {\"a\":1,\"b\":2}\n",
    "\n",
    "print(type(a))\n",
    "print(type(b))\n",
    "print(type(c))\n",
    "print(type(d))\n",
    "print(type(e))\n",
    "print(type(f))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "変数に対して `type` 関数を使えば、変数に代入されているオブジェクトの型が分かります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 10\n",
    "print(type(a))\n",
    "\n",
    "b = \"abc\"\n",
    "print(type(b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2 型による演算の違いと型の変換 \n",
    "\n",
    "同じ演算子（計算記号）を使っていても、オブジェクトの型によって演算の意味が変わります。\n",
    "\n",
    "例えば、「`+`」は数値（整数と小数）に対しては加算を意味しますが、文字列に対しては結合を意味します。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 1\n",
    "b = 2\n",
    "print(a+b)\n",
    "\n",
    "c = \"Niigata\"\n",
    "d = \"University\"\n",
    "print(c+\" \"+d)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "「数値+文字列」または「文字列+数値」を計算しようとすると、型の不一致でエラーになります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 正しくない使用例\n",
    "a = \"1\"\n",
    "print(9+a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 正しくない使用例\n",
    "score = 100\n",
    "print(\"点数は\"+score+\"点です。\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "このエラーを防ぐには、int関数またはfloat関数、str関数で型の変換を行います。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 正しい使用例\n",
    "a = \"1\"\n",
    "print(9+int(a))\n",
    "\n",
    "score = 100\n",
    "print(\"点数は\"+str(score)+\"点です。\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "なお、数値の計算の過程では、整数型の変数が自動的に小数型に変換される場合があります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = 10\n",
    "a = a+1.0\n",
    "print(a, type(a))\n",
    "\n",
    "b = 4\n",
    "b = b/2\n",
    "print(b, type(b))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. リストの使用\n",
    "\n",
    "### 2.1 リストの作成\n",
    "\n",
    "複数のデータをまとめて扱うためには、リスト（配列）を使用します。リストの作成方法としては、角括弧\\[\\]の中にデータ（数値や文字列）をカンマで区切って並べます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "number_list = [1,3,5,7]\n",
    "print(number_list)\n",
    "\n",
    "name_list = [\"Aさん\",\"Bさん\",\"Cさん\"]\n",
    "print(name_list)\n",
    "\n",
    "empty_list = []  #空のリスト\n",
    "print(empty_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 リストの要素の参照と変更\n",
    "\n",
    "リストの各要素は、`list[index]`の形で参照します。`index`は要素の番号で、`1`ではなく`0`から始まる点に注意が必要です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(name_list[0])\n",
    "print(name_list[1])\n",
    "print(name_list[2])\n",
    "\n",
    "print(number_list[0]+number_list[3])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "参照した要素に新たな値を代入することで、要素の変更が可能です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "number_list[2] = 0\n",
    "print(number_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3 リストの要素の追加と要素数\n",
    "\n",
    "リストの末尾に要素を追加するために、appendメソッドが用意されています。メソッドというのは特定の型のオブジェクトと結び付いた関数のことで、`object.method(parameter)`の形で使います。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "number_list.append(10)\n",
    "print(number_list)\n",
    "\n",
    "name_list.append(\"Dさん\")\n",
    "print(name_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "len関数を使えば、リストの要素数を求めることができます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(len(number_list))\n",
    "print(len(name_list))\n",
    "print(len(empty_list))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. for文による繰り返し\n",
    "\n",
    "### 3.1 for文の書き方\n",
    "\n",
    "プログラムの中で特定の処理を決まった回数繰り返す（ループする）場合に、for文を使います。\n",
    "\n",
    "書き方は次の通りです。\n",
    "```\n",
    "for 変数 in リスト:\n",
    "    処理1\n",
    "    処理2\n",
    "    …\n",
    "```\n",
    "\n",
    "Pythonにおいては、for文などのコードのブロック（処理のまとまり）をインデントで表現します。インデントは、Tab（または半角スペース4個）を入力してください。\n",
    "\n",
    "※他のプログラミング言語では、endなどブロックの終わりの目印を書くのが普通です。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "number_list = [1,3,5,7]\n",
    "for a in number_list:\n",
    "    print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習1\n",
    "\n",
    "与えられたリスト\\[1, 3, 5, 7, 9\\]を元に、for文を使って新しいリスト\\[1, 9, 25, 49, 81\\]を作成してください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "given_list = [1,3,5,7,9]\n",
    "print(given_list)\n",
    "new_list = []\n",
    "\n",
    "#ここに、for文を書いてください。\n",
    "\n",
    "print(new_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.2 range関数の使用\n",
    "\n",
    "range関数を使うと、連続した整数の列（または等差数列）を得ることができます。得られるオブジェクトはほぼリストと同じように扱えますが、厳密にはrange型という別のものです（値を表示したいならlist関数でリストに変換する必要があります）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(range(10))\n",
    "print(list(range(10)))  #range(b)は、0からb-1までの整数の列\n",
    "print(list(range(2,7)))  #range(a,b)は、aからb-1までの整数の列\n",
    "print(list(range(1,10,3)))  #range(a,b,c)は、aからb-1までの公差cの等差数列"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "for文において、リストの代わりにrange関数を使うと便利な場合があります。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "name_list = [\"Aさん\",\"Bさん\",\"Cさん\",\"Dさん\"]\n",
    "score_list = [70, 90, 50, 60]\n",
    "for i in range(4):\n",
    "    print(name_list[i] + \"の点数は\" + str(score_list[i]) + \"点です。\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習2\n",
    "\n",
    "for文とrange関数を使って、1から10までの整数の和を求めるコードを書いてください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "result = 0\n",
    "\n",
    "#ここに、range関数を用いたfor文を書いてください。\n",
    "\n",
    "print(\"1から10までの整数の和は\",result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 演習3\n",
    "\n",
    "任意の数値のリストが与えられたときに、for文を使ってリストの要素の平均を求めるコードを書いてください。余裕があればさらに、リストの要素の分散を求めるコードを追加してください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "given_list = [64,41,79,56,29,98,71,37]\n",
    "print(given_list)\n",
    "result = 0\n",
    "\n",
    "#ここに、for文を書いてください。\n",
    "\n",
    "print(\"リストの要素の平均は\",result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第2回レポート課題\n",
    "\n",
    "演習1～演習3に取り組んでください。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ここに演習１〜３のコードを書いてください。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "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.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
