機械学習のためのPython文法まとめ

# What 
Chainerを利用して機械学習を学ぶにあたり、私自身が、気がついた点、リサーチした内容をまとめる記事になります。私の理解に基づいて記述しているため、間違っている場合があります。間違いは都度修正するつもりです。
**御礼**
自分の振り返りのために書いていましたが、予想外にも見ていただき反応を示しており驚いております。また、時間を割いてまでコメントやご指摘を頂き感謝いたします。とても参考になっております。
に基づいて記述しているため、間違っている場合があります。間違いは都度修正するつもりです、ご容赦ください。

# Content

## 1.はじめに　に関するノート

### Jupiter Notebook
大元の開発環境みたいです。クラウドサービスの一つであるGoogle Colaboratoryが提供している。ブラウザ上で動くようだ。

### ランタイム
プログラムを実行するタイミングを指している。ここではプログラムの実行からの経過時間を示しているようだ。

## 2.Python入門　に関するノート
### 除算
返り値は必ずfloat型になる
string型に対しては乗算ができる。　繰り返し出力

### 比較演算子
戻り値はbool型　exa. type(1 < 2) => true

### エスケープシーケンス
改行 ¥n, タブ ¥t *print()関数の時有効

### 文字列変換メソッド
大文字or小文字化するメソッドがある。変数strに対しstr.upper(), str.lower()で変換できる

### 文字列挿入メソッド
文字列に文字列を挿入できるメソッドがある。.format()

### リスト（配列)
先頭からではなくて末尾から参照する方法がある、ラストはインデックスに[-1]を指定、[-2], [-3]と戻る
どうもこのリストに関する機能が豊富にあるので、次回に回すことにする

### zip 組み込み関数
下記、参考
https://note.nkmk.me/python-zip-usage-for/

### list(リスト)
いわゆる配列。要素数はlengthに由来したlen(value)で書く。配列の一部分だけ抜き取る操作（スライス）も簡単にできる。

```py
array[x:y] # xは開始要素、yは続いて読み込む数　xからy個読み取る
```

と言った指定。xもyも省略可能。多次元配列の時に、特定の配列だけ抜き取り値ときに使う。arrayだと全ての配列を読み込んでしまう。なぜか、多次元リストとは呼ばないようだ。
値挿入は末尾なら簡易操作可

```py
array.append(x) # 末尾にxを挿入
```

### tuple(タプル)
値の書き換えが不可能なリスト(配列)。主に定数をまとめて扱う時に使う。
メリットは明示できること？？

```py
array = (1, 2, 3, 4) #　初期化
array[0] = 1         # リストと同じ読み取り方　便利か不便か・・・
```

### ミューダブル(mutable)/イミューダブル(immutable)
値の書き換えができる、できないを表す言葉

### Dictionary
Pythonもkey & valueのセットが使える。例えば

```py
array_vector = ('x': 10, 'y': 20, 'z': 30)
array_vector['x'] => 10
```

keys(), values(), items()でそれぞれのリストを取得できる。返り値はそれぞれ
dict_key, dict_values, dict_items

### 制御構文　for
>Python の制御構文は、ヘッダ (header) と ブロック (block) と呼ばれる 2 つの部分で構成されています。 これらを合わせて 複合文 (compound statement) と呼びます。

とのこと。さらに
>イテラブルオブジェクト (iterable object) とは、要素を一度に1つずつ返せるオブジェクト。 range() という組み込み関数を使うと、引数に与えた整数の回数だけ順番に整数を返すことができます。 range(5) と書くと、0, 1, 2, 3, 4 という整数 5 つを順番に返すイテラブルオブジェクトになります。

c言語の時でいう条件式は書かずオブジェクトに書いてイテラブルオブジェクトとして与えるみたい。
要素数が可変のリストをイテラブルオブジェクトとして与える場合は

```py
for i in range(len(array)):
```

と書いてあげると要素数に対し過不足なく繰り返し処理が行われる。可読性の高い記述方法はリスト自体をイテラブルオブジェクトとして渡すこと

```py
for i in array:
```

`enumerate()` という組み込み関数はイテラブルオブジェクトを渡すと、`(要素番号, 要素)` というタプルを 1 つずつ返すイテラブルオブジェクト。変数iはタプル型になる

```py
for i, j in enumerate(names) # タプル要素を受け取る変数が2つ必要
```

>複数のイテラブルオブジェクトを受け取り、その要素のペアを順番に返すイテラブルオブジェクトは`zip()`
`zip()`は、渡されたイテラブルオブジェクトそれぞれの先頭の要素から順番に、タプルに束ねて返します。
このイテラブルオブジェクトの長さは、渡されたイテラブルオブジェクトのうち最も短い長さと一致します。

複数のデータをまとめて処理したい時に使える？？？

### if
お馴染みの条件分岐式。if, elif, else。下記は記述例。`{}`も`end`も不要でみやすい！
ifに関しては特に特筆すべき点はなさそう。**条件式が`True`を返すときに実行される**

```py
if a > 0:    
    print('0より大きいです')
elif a == 0:
    print('０です')
else:
    print('0より小さいです')
```

### while
`while`ループも特筆すべき点はなし、スッキリした記述でみやすい！
`if`同様に条件式が`True`を返すときに実行される。


```py
count = 0

while count < 3:  # 条件式ない not False条件式でもOK
    print(count)
    count += 1
    break      #でループを強制的に抜けることもできる

```
書いてて気になったのですが、**1ループってどこからどこまで？**調べたらこんな記述が、
>Python では特別な文字を使わずに同じインデントがされている文を同じブロックとして扱います。

インテンドの管理には注意したいですね。
もう一つ, `True`, `Flase`以外の条件式判定方法はないか調べたところ
>bool型はint型のサブクラス. bool型TrueとFalseは1, 0と等価

とありましたので、数字でもいけるみたいです。サブクラス？？

###関数
関数の定義もシンプル。下記のように引数を初期化して渡すこともできる。
インテンドがブロックと等価なので定義終了は明記されない

```py
def hello(message='Chainerチュートリアルにようこそ'):
    print(message)
    return message # 返り値を明示することもできる
``` 
###変数のスコープ（寿命）
基本的にブロックを抜けると初期化されるよう。確かC言語と同じ。

```py
a = 1
# 関数の内部で a に 2 を代入
def change():
    a = 2  
change()
a # = 1 が出力
```
変数をグローバルに扱うには`global`と書けば良い。以下、サンプルの例文になるが、不明点が・・・

```py
a = 1
def change():
    global a  # a をグローバル変数である宣言
    a = 2       # グローバル変数への代入
change()
a # = 2 が出力
```
これってはじめに`a = 1`で`a`を定義してから`global a`に再定義しているんですかね？
それともはじめの`a`と`global a`ってプログラム内では区別されているんですかね？
一方以下のように記述したら文法エラーが出た

```py
global a = 1
def change():
    a = 2       # グローバル変数への代入
change()
a
```
ちょっと原因がイメージできていないですが、`global`宣言はローカルブロック内でのみ有効なんですかね？
ローカル変数からグローバル変数に変えますと言った具合。C言語みたいに最初からグローバルに使えるような宣言はできないのかな。
本当に困ったらちゃんと調べよう。

###Class
オブジェクトの概念はC++, Rubyを通してそれなりにイメージできている。
__init__はコンストラクタ。selfは生成したインスタンス自身を示す。
>メソッドは、インスタンスから呼び出されるとき自動的に第一引数にそのインスタンスへの参照を渡します。

とあるので、self自体はポインタだと思って差支えなさそう。ところで、self.name_plateは組み込み関数？（もしくは準ずる変数）

```py
class House:
    def __init__(self, name):
        self.name_plate = name

my_house = House('Chainer') # 宣言
```
引数は一つ。第一引数はselfと決まったものが与えられるから明示しなくて良い。
__init__に限らず、selfは呼び出し時に明示する必要はない。

###継承
C++と同じく継承できます。Chainが子クラスでLinkが親クラス。
ポイントはコンストラクタは記述がなければ親クラスのコンストラクタを呼び出す点。
子クラスから親クラスを参照する場合は`super()`を使う。
親クラスと同名の関数はオーバーライドされる。

```py
class Chain(Link):    

    def __init__(self):
        # 親クラスの `__init__()` メソッドを呼び出す
        super().__init__()

    def true():
        return True
```
### osモジュール
osモジュールは、OS（オペレーションシステム）の機能を利用する方法を提供するpythonの標準ライブラリ。

```py
  import as os
```



**以上で2章Pythonの学習は終了になります**長かった・・・w
次回は３章に取り組みます。
#Comment
Python文法に関する記事をひとまとめにしました。見返す時に記事を探し回らないといけないのがめんどくさくて・・・

最近寒くなってきたので、今年度初の入浴をしました。週末になるにつれ疲れも溜まり、仕事終わりに学習しようとしても眠くなりがちですが、しっかり入浴すると就寝までの集中力くらいは確保できますね。
継続するためには、体のコンディション整えて、無理せず、高い集中力を持って短時間取り組み続けるがベストだと思っているので。
リストに関する組み込み関数が充実している印象。早くアウトプットをしたいが、学習サイトが丁寧に書かれているためなかなか時間がかかる。明日には、Pythonの構文の学習は終わり数学の学習に入れそう。既知の内容は飛ばす予定。マークダウンをちょっとつづ覚える。