【超初学者向け】プログラミング記事でサラッと出てくる良くわからない単語を簡単に解説する記事

友人が大学の研究室Pythonを使うことになったということで、初学者に向けて、自分がプログラミングを始めたときに本やサイトでサラッと出てきて「これは何だ……？」となった単語をさらっと解説していこうと思います。
また、上記の理由から本記事では判例としてPythonを主に用います
初学者に向けた噛み砕いた解説のつもりなので、正確な定義とはズレるところがあるかもしれませんが、ご了承ください。
初学者がわからなそうな単語があればどんどん追記予定です。

# 目次
- [ディレクトリ](#ディレクトリ)
- [path](#path)
- [shell](#shell)
- [変数](#変数)
- [型](#型)
- [関数](#関数)
- [引数](#引数)
- [戻り値](#戻り値)
- [class](#class)
  - [メソッド](#メソッド)
  - [インスタンス](#インスタンス)
  - [コンストラクタ](#コンストラクタ)
  - [プロパティ](#プロパティ)
- [ライブラリ](#ライブラリ)

## ディレクトリ
ファイルを分類、管理する概念であり、windowsやmacで言うところのフォルダシステムに当たります。
そのプロジェクトの中で最も上位の階層のディレクトリのことをルートディレクトリと言ったりします。

## path
ディレクトリ上のファイル等の場所を指す情報のことです。
OS側に実行したいファイルの場所を教えることをpathを通すといいます。
例えばwindowsでPythonを使う場合、コントロールパネルから環境変数に実行したいpathを追加することで、ターミナルに

```bash
python
```

と打つだけで実行できるようになる。

## ターミナル
キーボードでコマンドを打って、コンピューターに任意の命令を実行させる環境のことです。
普段我々が使っている、マウスで画面を操作するUIをGUIというのに対し、CUIと呼ばれます。
windowsならスタートの検索バーに`Terminal`と打つと出てくる`windows terminal`の事です。

## shell
ターミナル上で打った命令をコンピューターに伝えてくれるプログラムのことです。
有名なところでは`bash`,`zsh`,`fish`など、多様なシステムが用意されています。
筆者のおすすめは`xonsh`です。

https://qiita.com/ihcamonoihS/items/659278e6fa7a4a130e1a

## 変数
名の通り、複数の値を取りうる値の事で、Pythonでは

```python
someVariable = 100
```

```python
someVariable = 'variable'
```

の用に定義することが出来、様々な型の値を代入することが出来ます。
複雑な計算処理などを行う場合に、数値をそのまま列挙してしまうと、特定の値を変更する際などに逐一式内の変更したい定数を目視で探して変更しなければならなかったりと、非常にミスを誘発しやすくなるので、プログラミングでは基本的に変数を用います。

## 型
プログラミング言語に置いて最も重要な単位であり、**データの種類**を示します。
例えば1,2,3,5のような整数は`int`型、1.1,1.3等の小数点を含む実数はPythonでは浮動小数点数として扱い、`float`型になります。
他にも、文字列`string`や配列`list`等の型が存在します。

また、プログラミング時に型を予め定義して置かなければならない言語を静的型付け言語、プログラミング時に型を定義しなくても実行時にシステムが型を管理してくれる言語を動的型付け言語と言い、Pythonは動的型付け言語です。
静的型付けと動的型付けのそれぞれのメリット・デメリットに関しては余白が足りないので今回は解説しません。

## 関数
`print()` や `abs()` 等のような、`関数名()` のような書き方をする機能の単位のことを関数といいます。
関数は、プログラミングを勧める上で基本的な要素であり、殆どの場合、関数を組み合わせてプログラミングをしていくことになります。
また、関数を利用することを「関数を呼び出す」等と言います。

pythonで新しい関数を作る場合、以下のように定義します

```python
## someArgumentは必要とする引数
def someFunction(someArgument):
  処理
```

## 引数
関数 `print()` 等の括弧内に入れる値のことを示し、`関数(引数)`の用に書きます。
関数によって引数を必要とするかしないか、どのような型の引数を必要とするかは個別に定義されています。
例えば、関数`abs()`は数値型(`int`等)を要求します。

## 戻り値
関数によって導き出される結果のことを示し、例えば`abs(-100)`は戻り値として`100`を返します。
戻り値も関数によってどのような型の戻り値を返すかが決まっており、`abs()`は引数として渡した数値の型(intならint,floatならfloat)を返す用に設定されています。

## class
これだけで1記事書けるほどに奥が深いですが、ざっくり解説するとデータを処理する機能をまとめた設計図のようなものです。
例えば、とある学校の学生一人一人に関するデータを処理したい場合は以下のようなクラスを作ります。

```python
class Student():
  # インスタンスを初期化するところ、コンストラクタと呼ぶ
  def __init__(self, name, age, grade):
    self.name = name # 学生の名前
    self.age = age # 学生の年齢
    self.grade = grades # 学生の成績
  # 学生の名前を返すメソッド
  def getName(self):
    return self.name
  # 学生の年齢を返すメソッド
  def getAge(self)
    return self.age
  # 学生の成績
  @property
  def grades(self):
    return self.grades
  @grades.setter
  def grades(self, grades):
    if grades != ('A' || 'B' || 'C' || 'D'):
      self.grads = grades

```

以上のようなクラスが学生に関するデータ処理を纏めた設計図となります。
以下に関連する項目を小項目で纏めていきます。

#### メソッド
クラス内で定義している関数のようなもののことを、メソッドと呼びます。役割としてはほぼ関数のようなものです。

#### インスタンス
上記のようなクラスを利用したい場合、クラスの**実体**を作る必要があります。これをインスタンスと呼びます。
料理で例えるならクラスがレシピ、インスタンスが完成した料理のようなものです。
上で作成したクラスを実際に使おうとすると以下のようになります。

```python
yamadaTaro = Student('山田', 18, 'A')

yamadaTaro.getName()
#山田が出力される
yamadaTaro.getAge()
#18が出力される
```

このように、classに必要な要素を渡して実体化し、使用できるようにしたものをインスタンスと呼びます。
また、上のクラスのメソッドの引数に渡されている`self`は、メソッドに自分自身のインスタンスを渡しているという処理になります。
この`self`に当たる部分は実装上どのような名前でも構いません(慣習的に`self`となっているので理由がない場合変えないほうが良いです)が、Pythonの第一引数は必ずインスタンスを渡さなくてはなりません。

#### コンストラクタ
上で定義したクラスの`__init__()`の部分のことです。
他のメソッドと同じ用に記述されていますが、この部分のみ役割が違っています。
コンストラクタは、インスタンスが生成された際にそのインスタンスを初期化する役割を担っています。
上で作ったクラスの場合、学生インスタンスが生成された際に、引数として`name`,`age`を受け取り、それをインスタンス内の変数に追加するという処理を行っています。

#### プロパティ
上で定義したクラスのメソッドの中に、`@property`と上についているメソッドがあることにお気づきでしょうか？
これはプロパティと呼ばれるもので、簡単に言えばインスタンスの変数に対する値の変更に対して処理を加えるものです。
例えば、上のクラスでもし`grades`がプロパティでなかった場合
```python
yamadaTaro = Student('山田', 18, 'A')
yamadaTaro.grades()
# 'A'が返ってくる
yamadaTaro.grades = ''
yamadaTaro.grades()
# ''が返ってくる
```
のように、予期しない値を簡単に代入してしまうことが出来てしまいます、プロパティにはそれを防ぐ意味合いがあります。
例えば、上のクラスで
```python
  @grades.setter
  def grades(self, grades):
    if grades != ('A' || 'B' || 'C' || 'D'):
      self.grads = grades
```
と書いてありますが、この`setter`は`grades`に変更が加えられたときに下の処理を行う、という意味合いになります。
この場合、値がA,B,C,Dのいずれかである場合のみgradesを書き換え、その他の場合は処理を行わないという実装になっています。
こうする事によって、よきせぬ値の代入を防ぐことが出来ます。
今回は例のため、1つの値だけプロパティとか言う気持ち悪いことになっていますが、気持ち悪いので真似しないでください。

## ライブラリ
ライブラリとは、凄い人達が作ってくれた、便利な関数やクラスを纏めたパッケージです。
Pythonでは主に`pip`という管理マネージャーを使って管理することが多いです。
導入方法に関しては長くなるので別途調べてください。

Pythonで導入したライブラリを使用する場合、基本的にファイルの一番上に以下のように書きます。`numpy`はPythonで最も有名な数値計算ライブラリです。

```python
import numpy
```
ライブラリの関数を使うときは以下のように書きます

```python
numpy.someFunction()
```