# プログラミング概観、Pythonインタプリタの起動、逐次処理、変数の利用

## 今日の達成目標
- 教科書と講義資料を参照し、以下を理解するとともに課題レポート1のLevel3まで取り組むことが出来る。
  - 想定時間：講義資料の理解＋演習1〜3で1.5時間。課題レポートLevel3までで0.5時間。復習0.5〜1.5時間。予習0.5〜1.5時間。
- プログラミングには3つのステップ（理解、整理、翻訳）があることを理解する。
- 教科書のコード例を動かすことができる。
- 代表的な型（int, float, str）を区別できる。type()を使って型を確認できる。
- リテラルや演算結果を変数に保存することができる。
- リテラルや演算結果、または変数の中身をprint()で出力できる。

---
## プログラミングとは何か？

>**[プログラミングとは？]**
>
>[スーパー大辞林]によると以下の通り。
>
>(1) 物事の予定。行事の進行についての計画。
>(2) 映画演劇コンサートなどの演目や曲目，あらすじや解説などを書いた表や小冊子。
>(3) コンピューターに，情報処理を行うための動作手順を指定するもの。また，それを作成すること。

授業「プログラミング」でやるのは(3)。でも、(1)〜(3)は何かしら共通してるところがあるから「プログラム」と呼ばれているのではないだろうか？

```{tip}
3.2.1〜3.2.3は共通点を深堀りしていく内容であり、時間のあるときに読んでみよう。授業ではスキップし、上記(3)をやるための手順として、3.2.4を眺めていくことにする。
```

---
### 行事の開催とプログラムの実行を比べてみる
- 行事の開催
  - <u>書かれている順番通り</u>に司会者が実行する。
  - 司会者は人間であり、式次第は **自然言語** で記述されている。
  - 式次第をどう実行するかは、**司会者の裁量** に委ねられている。
  - **実行する度に何かしら違いがある。**
- プログラムの実行
  - <u>書かれている順番通り</u>にコンピュータが実行する。
  - コンピュータは計算機であり、プログラムは **プログラミング言語** で記述されている。
  - プログラムをどう実行するかは、**言語仕様で厳密に規程** されている。
  - **何度実行しても必ず同じように実行する。**

行事の開催と、コンピュータにおけるプログラムの実行には異なる部分（**太字**）も多いが、<u>下線</u>で示したように共通する部分もある。この実行される内容を「プログラム」と呼んでいる。

---
### 「プログラム」の特徴
1年前期ではPythonのみを扱い、多くの言語に共通する「プログラミングの考え方」とともに具体的な言語仕様について学ぶ。1年後期では第2言語、第3言語としてJavaとC言語を学ぶ。

一般的な行事の場合、実行するためには場所や人員を確保し、プログラムの内容や実行方法を関係者全員に周知した上で実行する必要がある。このため様々な点でコスト（金銭・時間等）がかかり、また人間が実行するために、再現が容易ではない。

これに対しコンピュータにおけるプログラムは、明確な仕様に基づいた専用のプログラミング言語で記述されており、実行方法が同一であり、コンピュータ（実行環境）さえあればどこでも再現可能である。この特徴を活かすことで、プログラムの更新履歴を管理（バージョン管理）したり、想定通りの動作をしているかの確認（テスト）を自動化するなど、コンピュータにおけるプログラムならではの特徴を踏まえた周辺技術についても学ぶ。

- **実行するのはコンピュータ**
  - コンピュータ言語（プログラミング言語）
    - Machine code (機械語)
    - Assembly language (アセンブラ)
    - Basic, C言語,,,,
    - Java (後期授業「プログラミング2」
    - 軽量プログラミング言語
      - 何らかの実際の機能によるカテゴライズではなく、習得・学習・使用が容易な言語
      - Perl, PHP, Ruby, Python,,,
- **再現が容易**
  - 書いた通りに動く
- **複製が容易**
  - 複製コストはほぼ無視できる
- **（条件付きで）編集や再利用が容易**
  - テスト（Testing）
  - バージョン管理

---
### 「プログラミング」とは？（広辞苑＆補足）
プログラミングとは、プログラムを作成することを指す言葉ではあるが、より広義には「どの順序で目的を達成したらよいか？」を検討すること（＝仕様の決定）や、自身や第三者が書いたプログラムにおける誤り（バグ）を修正する等、幅広い作業を含むことも多い。コンピュータに実現してもらいたいことを手順書として記述したものがプログラムであることは既に述べたとおりだが、コンピュータはプログラミング言語しか解釈することができないため、**まずはプログラミング言語の仕様について学ぼう**。そのため、当面はほぼ仕様決定済みの課題について取り組むことになる。

- 広義
  - コンピューターのプログラムを作成すること。プログラムの仕様の決定，誤りの修正などの作業などを含めていうこともある。
  - ≒コンピュータとの対話
    - こちらの意図を伝える。
    - コンピュータの意図を汲み取る。
- 狭義
  - (仕様通りに)プログラムを書くこと。
  - 「コーディング」

---

### プログラミングに含まれる3ステップ
```{figure} ./figs/w1-programming.svg
:name: w1-programming
プログラミングに含まれる3ステップ
```

コンピュータはプログラミング言語しか知らないので、プログラマは実現したいことをプログラミング言語に翻訳する必要がある。つまりプログラミングとは実現したいことを翻訳する作業である。これは日本語を英語に翻訳することと同様の過程を辿る。

第1に **「実現したいこと」の理解** である。例えばここでは「三角形の面積を求める」だとしよう。

第2に **「理解したこと」を手順として説明** できるレベルまで整理しよう。先程の例であれば、(1) 三角形の高さと幅を用意する。(2)用意した高さと幅を使って面積を求める。ぐらいの2手順でできそうな気がする。

第3に **プログラムへ「翻訳」** する。前述に例なら例えば次のようなコードを思いつく。
```python
height = 5
width = 3
area = height * width / 2
print(area)
```

なお、記述されたプログラムには最後の翻訳結果しか残らないことが多い。これは日英翻訳等様々なプロの仕事と同じで、成果物だけからその過程を観察することは、できなくはないだろうが困難である。

プログラミング1では合計7回の課題レポートを課す予定だが、この際にも最終的に書いたコードだけを示すのは不十分である。与えられた課題に対しどう考え、どう取り組もうとしたのかという過程を説明するように心がけよう。なお、最初のレポートはとても簡単なため、ほぼ過程もないかもしれない。そのような場合には結論だけでも構わない。

別観点として、本来ならば「そもそも分からない点をどう伝えればよいのか」といったことも含めて「相談や教え合い」を大切にしてほしい。しかしながら、2021年4月時点では引き続き新型コロナウイルスの影響下にある。このため対面でのやり取りを制限せざるを得ない。文章でのやり取りを中心に、必要に応じてZoom（動画やり取り）等を使いつつ、伝える力を養おう。

---

### プログラミングを円滑に進めるために
当面は四則演算や文字列結合、処理結果の保存や出力といった基礎的なことを学ぶ。この際、開発を円滑にすすめるためのデバッグ実行も随時触れていくこととする。

- 当面
  - 逐次実行、四則演算、文字列結合、変数、出力
  - 条件分岐、ループ処理
  - 関数、スコープ
  - 浮動小数点型
  - シーケンス集合、辞書型
  - ドキュメンテーション
- より高度な機能
  - ベクトル・行列演算
  - グラフ描画
  - 正規表現
  - 後期
    - オブジェクト指向
- 開発の円滑化
  - テスト(Testing)
  - デバッグ実行
  - バージョン管理

---
## 演習1：教科書のコードを動かしてみる
サンプルコードを動かすためには、ターミナルを起動し、その上でPythonインタプリタを起動する必要がある。現在ターミナル上で何が動作しているかはプロンプトで判断できる。**{index}`プロンプト<ぷろんぷと-プロンプト>`（{index}`prompt`）** とは「命令の入力を待っている状態である」ということを明示するための目印である。

ターミナルを起動した直後は自動的にシェルが動作しており、Enterキーを押すことで同じプロンプトが返ってくる。この状態（シェルが入力を待っている状態）で、pythonと入力し、Enterキーを押すとPythonインタプリタが起動される。Pythonインタプリタが動作しているなら、 ``>>> `` というプロンプトが出力されているはずだ。この状態で何も命令を記述せずEnterキーを押すと、何度でもプロンプトが返り、「命令待ち」であることを示される。

**この一連のやり取りも「コンピュータとの対話」である。コンピュータに対し何を伝えているのか、その結果コンピュータは何を返してきているのかを意識しながら取り組もう**。

- コード例を動かす手順
  - step 1: 「{index}`ターミナル<たーみなる-ターミナル>`」を起動。
    - Finder => アプリケーション/ユーティリティ/ターミナル.app
    - Dockへ登録しておくと便利。
  - step 2: {index}`Pythonインタプリタ`の起動。
    - ``python`` と入力。
  - step 3: インタプリタにコードを入力し、Enterキー（=実行）。
    - e.g., 最初のコード例, 2.1節
      - ``print(‘Yankees rule!’)``
      - カッコ内の ``'`` は{index}`シングル・クォート<しんぐる・くぉーと-シングル・クォート>`と呼ぶ。「Shiftキー + 7」。
    - 注意点
      - 日本語入力モードではなく英数モードで入力しよう。
        - 英数モード例: ``print('Yankees rule!')`` => 出力されるはず
        - 日本語モード例: ``print（’Yankees rule!'）`` => SyntaxError
        - 上記では丸括弧が日本語モード（全角文字）で入力されている。半角文字と全角文字は見た目通り異なる文字である。プログラミング言語は厳密に使用が決められているため、全角の同じ記号で入力したとしても配慮してくれない。
  - step 4: インタプリタを終了。
    - ``exit()`` もしくは **{index}`Ctrl+d`**（Controlキーを押しながらdを押す）。
  - 上記 step 1〜4 を数回繰り返そう。これで教科書等のコード例をすべて動かすことができる。
- 2.1節コード例の補足
  - ``print('Yankees rule!')`` における ``print()`` は「[print関数](https://docs.python.org/3.8/library/functions.html#print)」と呼ばれている。
    - プログラミングにおける **{index}`関数<かんすう-関数>`（{index}`funciton`）** とは、数学的な関数とは無関係である。「**何か特定の処理をまとめたもの**」を関数だと考えておこう。
    - **print関数** とは、指示された内容を出力するための関数である。
    - ``print(1)`` と書けばそのまま1と出力する。print(1)のように括弧内に書いたものを **{index}`引数<ひきすう-引数>`もしくは{index}`パラメータ<ぱらめーた-パラメータ>`（{index}`arguments`, {index}`parameters`）** と呼ぶ。英表記では複数形になっているように、関数によっては複数を与えることが可能だ。``print(1, 2, 3)`` と書けばどのように出力されるだろうか。まず答えを想像し、その次に実際に試して確認してみよう。
    - print関数で指定する引数が数値ならばそのまま書いて良い。しかし ``hello`` のような文字列を指定したい場合には ``'hello'`` もしくは ``"hello"`` のように、シングルクォートもしくはダブルクォートで文字列を囲う必要がある。これは、もし囲わなかった場合にはprint関数のようにPythonが予め用意している関数と誤解しないように明確に区別するための措置である。

````{admonition} Check your understading
以下の用語について説明してみよう。

- プロンプト
- 関数
- 引数
````

---
## 演習2：オブジェクトと式と型（教科書2.1.1節）
```{figure} ./figs/w1-ex2.svg
:name: w1-ex2
演習2：オブジェクトと式と型
```

コンピュータで扱う具体的な値は **{index}`リテラル<りてらる-リテラル>`（{index}`literal`）** と呼ばれている。数字の1や文字列の"hello"などのことをリテラルと呼ぶ。リテラルは必ず何かしらの **{index}`型<かた-型>`（{index}`type`）** を持っており、あらゆる演算・式・評価といった処理は型に応じてその動作が決定される。

例えば、
```python
>>> 1 + 1
2
```
上記は整数の1と整数の1を足し合わせている。その実行結果として整数の2が返ってきた。

これに対し、
```python
>>> 1 + '1'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
上記は「整数の1」と「文字列の1」を足し合わせようとしている。が、そのような動作は定義されておらず、コンピュータから妙な結果 ``TypeError`` が返ってくることになる。{index}`TypeError`はエラーの一種であり、ここではType、すなわち型がなにかおかしいということをコンピュータが指摘している。なお、「文字列同士の+演算子による動作」は定義されており、動作する。確認してみよう。

- 代表的な型とリテラルの例。
  - {index}`int型`: 整数 (integer)を表すための型。例えば 1 や -10 等。
  - {index}`float型`: 実数もしくは浮動小数点数 (floating point number) を表すための型。例えば 3.14。
  - {index}`str型`: 文字列 (string)を表すための型。例えば 'naltoma'。
    - 文字列はシングル・クォート（`）もしくはダブル・クォート（"）で囲って書きます。このため '1' は数字ではなく、文字列です。

```{note}
どうおかしいのかに関する説明が後ろに続いている。「{index}`unsupported operand type(s) for +: 'int' and 'str'`」とは「intとstrを+演算子で操作することはサポート外だ」と伝えている。このようなコンピュータからの応答を少しずつ読めるようになろう。応答分の意図を汲み取ることができるようになると、どこがどうおかしいのか検討がつきやすくなり、プログラムの修正に役立てやすくなる。このやり取りがコンピュータとの対話を通した開発という意味である。
```

````{note}
型を把握することはとても大切であり、ここでは **基本的な型として int, {index}`float`, str** をひとまず覚えておき、必要に応じて教科書を参照して別の型についても調べられるようにしておこう。また、型の調べ方として ``type()`` を覚えておこう。{index}`type関数`は後述する変数に対しても適用できる。
```Shell
>>> type(123)
<class 'int'>
>>> type('123')
<class 'str'>
>>> height = 10
>>> type(height)
<class 'int'>
```
````

```{tip}
Python標準で用意されている型は[公式ドキュメントの組み込み型](https://docs.python.org/ja/3.10/library/stdtypes.html)を参照してみよう。現時点ではint, float, str, boolぐらいを扱い、今後少しずつ他の型を学んでいきます。
```

---
## 演習3：変数と等号の利用
```{figure} ./figs/w1-ex3.svg
:name: w1-ex3
演習3：変数と等号の利用
```

計算結果を一度しか使わないのであれば、変数はなくても構わない。そうでない場合、例えば「あるゲームの上位100人対してプレゼントを配布する」という処理をしたいとしよう。このような場合にはまず上位100人をメモしておき、一人ずつ処理する流れをとる、、、というように、上位100人の一覧を参照しやすいようにメモとして残しておきたい。このメモのことをプログラムでは **{index}`変数<へんすう-変数>`（{index}`variable`）** と呼び、何かしらの名前をつけて計算結果を保存しておくことができる。

上図では左側のコードに対応する形で、各コードの意味を右側に列挙している。これを理解できるようになろう。

- 補足
  - **{index}`等号<とうごう-等号>`（{index}`=`）** の意味
    - 数学では、等式。「左辺と右辺は等価である」という意味。
    - Python（プログラム）では、assignment(割り当て)やbinding(紐付け)のことを指し、一時的に名前の付いた保管庫へ保存する動作のこと。
      - 次のように動作する。
        - **(1)右辺をevaluate(評価≒実行)し、**
        - **(2)その結果を左辺の変数に保存する。**
  - 実行後に残らない内容
    - 何をどう処理したかは記録に残らない。PCに搭載しているメモリは有限。有限な資源を効率良く使うため綺麗サッパリ忘れてしまう。
  - 実行後に残るデータ
    - コードを実行することで「得られた値」が **一時的** に残る。「得られた値」は、**等号を使って変数に紐付ける（保存する）** ことで、再利用することができる。
  - 逐次処理
    - 順番通りに実行する。

```{note}
変数名は **英数字や {index}`underscore`（``_``のこと）を組み合わせて使う** ことが一般的だが、冒頭に数字を用いることはできない点に注意すること。実際に試してみよう。
```

```{note}
数学では変数xとの演算を $2x + 1$ のように掛け算を省略して書くことがある。これに対し **プログラム上では演算子を省略できない**。つまり ``2 * x + 1`` のように演算子を記述する必要がある。なおスペースを挿入せず ``2*x+1`` のように記述しても良いが、適度にスペースがある方が読みやすいことが多いことから、大抵はスペースを挿入して記述する。
```

---
## 授業の進め方
### 予習・復習を前提に進める
- 大学における授業の位置付け
  - [大学設置基準](https://www.kyoto-u.ac.jp/uni_int/kitei/reiki_honbun/w002RG00000949.html#e000000591)により「一単位の授業科目を四十五時間の学修を必要とする内容をもつて構成することを標準」と定められている。大学における多くの講義は2単位であるため、1科目辺り90時間の学修が求められている。90時間を15回で割ると1回あたり6時間。このうち授業が1.5時間のため、授業以外の時間で毎週4.5時間の自習を求めている。
- 予習・復習：教科書は各自の自習教材
  - 教科書読んで分からないことは自分から相談しよう。教科書を読んで分かることを、わざわざ授業時間に一緒にやるのは時間が勿体無い。
  - 授業では Part 1 (Chapter 7まで)をメインに扱う。約100ページ。余裕がある人は11章までやってから、Chapter 12以降を好きな順番でトライ！
  - 該当Chapterを4回は読もう。同じペースで読む必要はない。分かる部分はショートカットし、分からない部分を減らしていこう。
- オリジナル課題のすゝめ
  - 予習・復習とは別に、自身で取り組みたいことをやる時間も取れると良い。例えば、「2単位授業の自習4時間」のうち、予習・復習を平均して2~3時間で終え、残り時間を自身や仲間らとのプロジェクトに割り当てる等。

---
### 一人ではやれないことをサポート
- 授業でやること
  - 細かい環境構築。
  - 重要な点に関する解説。デモ・演習。
  - 一人ではやれないこと（ペア・プログラミング or モブ・プログラミング）。
    - 思考や疑問を言語化する練習。
    - 伝えることを通して「手順の考え方」や「翻訳の仕方」の例に触れる機会を増やす。
  - 講義「プログラミング演習1」との連携。
    - 課題サポート等
- 授業でやらないこと（＝一人でやれること）
  - 教科書音読など。高校まででは良くあるが、大学では自習でやるもの。自分で読んでわからないところはどんどん質問しよう。

---
### 教育目標
- できるとは、「次の一歩」が分かること
- 授業方針
  - しばらくは「例示 + 解説」。
  - 「次の一歩」が分かるまで手を貸す。
    - E.g., 2年次以降ではスマートフォンのアプリ開発したりしますが、そこで使う言語「Swift」等、新しい言語は独学になります。
    - 独学できる力、調べ方、トラブルシューティングの力、、、（＝「次の一歩」を検討する力）を学ぼう。正解があるとは限らない状況において、「次の一歩」を検討し、行動に移せるようになろう。

---
### プログラミングを勉強する際のポイント
- 疑問を持とう
  - この単語はどういう意味？
  - このコードは何をやろうとしているのだろうか？
  - 何故こう書くのだろうか？
- やりたいことを文章や口頭で説明できるまで理解しよう
  - 説明できないことを「コードで書く」のは無理。
- 「こうなるだろう」と想像して実行しよう
  - 想像と異なる動作をした場合、それは学びを得るチャンス！　要因を調査しよう。

---
## 振り返り
```{figure} ./figs/w1-summary.svg
:name: w1-summary
まとめ
```

---
## 復習・予習
- 復習: 教科書読み
  - 1章　＊概要掴むぐらい（30分程度）でok
  - 2章〜2.1.2節まで　＊1〜2時間程度想定
  - 2.1.3節はスキップ。
  - 余裕ある人は2.2節。
- 自習(オススメ)
  - [progate](https://prog-8.com)
- 事前準備
  - 任意: テキストエディタ[CotEditorのインストール](./week2.html#id4)
