Python 入門(最速でクラス理解までの道)

#初めに
※前提:あくまでこの記事はTutorialを細かくなるべくわかりやすく説明するものです
**まだ一度もPythonに触れたことがない方へ**
この記事は[chainer Tutorial](https://tutorials.chainer.org/ja/02_Basics_of_Python.html)を参考に書いています。まず**分からなくても一通り読む**ことをお勧めします

##Pythonってどういう言語なの？どういう特徴もってるの？

他にもたくさんC#やRubyなどの言語がありますが、Pythonはその中でも特に優れている点があります

>**①データ解析と機械学習に優れている**
>>データ解析というと聞きなじみがあるようでないように思えますが、例えばApple社のiPhonにはSiriというAIアシスタントが付いています
Siriは**「Hei Siri!」**というと反応してくれます
これにはSiriが受け取った音声が**「Hei Siri!」**なのかを解析する必要がありますね
これを**データ解析**と呼びSiriがPythonでプログラムされてるかは分かりませんがそのようなプログラムを書くのにPythonは優れています

>**②webアプリケーションの開発にも使われている**
>>webアプリケーションというと何を指すのか分からない人もいると思います
**webアプリケーションとは**インターネットを介してそのアプリを使ってる人と、そのアプリを動かしているサーバーとのやり取りで**アプリを使ってる人の端末(ブラウザー)で動くプログラム、またはサーバーで動くプログラムを指します**
分からない人は初めのうちはLINEや掲示板など**インターネットにつないでなくては動かないアプリのことを指すという認識で構いません**(語弊あり)
そのようなアプリの開発にもPythonは優れているのです！


>**③初学者でも始めやすい！**
>>読んで字のごとくPythonは「プログラミング自体初めて！」という方にもお勧めできます
実際私もPythonから勉強し始めました(まだ未熟なのでこの記事内で間違いがあったらすいません)
なぜPythonは学びやすいのかはあくまで私の感想ですが**英語として理解できる**という点がすごく大きいのかなと思います。

以上の点においてPythonは優れているでしょう

#これから学ぶべきこと
これはTutorialの2.1.1に沿って書きます。
学ぶべきことは**文法**と**アルゴリズム**ですが
コンピューターで何かを開発して、自動化したい！という方もまずは**文法**を一番最初に学ぶべきで、これは避けて通れない道です
ここからはTutorialにあるように

- 変数
- 制御構文
- 関数
- クラス

を細かく説明していくつもりですmm

#変数について
~~**変数**とは名前の付いた入れ物です~~
ご指摘ありがとうございます:Pythonにおける変数は名前と値を紐づけて記憶するという概念らしいです

変数に値を一時的に記憶（紐づけ）しておいたり、必要に応じて別の値に記憶（紐づけ）を変更できます。
例えば、**食べたいもの**という変数を作ってそこに**リンゴ**を記憶しておくこともできますし、
**リンゴ**から**オレンジ**に記憶を変更することも可能です
##変数に値を記憶する方法
Pythonで変数に値を記憶するには**<変数> = <値>**といった形で記述しますこれをTutorialでは「左辺の変数に、右辺の値を代入する」といった形で書いていますが、普通に**「変数に値を代入する」**というだけでいいと思います(自論)
では実際に`number`という変数に`1`を代入するコードを書きます(サンプル)

```py
number = 1
```
これだけで`number`という変数を定義する処理と`1`を代入する処理が可能です
もし本当にこれで代入できてるのか気になる方は

```py
print(number)
```
このコードを`number = 1`の下に付け足して実行してみてください`1`と出力されれば完璧です
いま使った`print()`についてTutorialでは解説していますが、今説明すると混乱する人もいると思うのであとで解説します
あ、それと変数名については自由に変えてもらって構いませんがわかりやすい名前にするということとアルファベットを使う(`くだもの`はほんとはだめ)ということを守ってください
(人のこと言えないのですが)
##コメントについて
コード書いてるとき「あ、これここにメモしときたい！」となることが多いと思います
そういう時には`#`をメモしたい文章の前につけておくことで**`#`のあとのコードは完全にスルーされます**
例えば

```py
#これより下の文章はコメントとして書きます
#number = 1
```
これを記述してからその下に先ほどの

```py
print(number)
```
を記述してみてください
エラーが出るないしは何も表示されないはずです(numberなんて変数ないよ～)みたいな
その**エラーがおこるのは正しいこと**で(`1`と出力される場合`変数に値を入れる方法`で書いたコードを消して再度実行してください)
そのエラーがおこるのは`number = 1`の先頭に`#`をつけているのでコメントとして認識されています
それがゆえコードとして認識されずエラーが起きます
メモリたい時はこれを参考してください！
##値の種類
Pythonで扱う値にはいくつか種類があります(値の種類？って思う人もとりあえず読んでください)
これから絶対に使うだろうものは以下のものです

- 文字列(string)
- 整数(integer)
- 実数(real number)

これらの種類を型(type)と呼びます
なんでわざわざ分ける必要があるの？って思う人もいると思います
Pythonでは値の型を自動的に判断する機能が付いており、
コンピューターではこれらを分けなくては混乱が発生してしまうというのが答えです

まず**文字列**というのは
`りんご`や`furuit`など数字ではないものを指します(語弊あり)
Pythonでは値を文字列として認識させるために`'`あるいは`"`で文字列としたい値を囲う必要があります

```py
fruit = 'りんご'
```
このようにすることでPythonが値を文字列として認識してくれます

そして**整数**というのは
意味的には文字通りで、とくに囲ったりする必要はなく普通に

```py
num = 1
```
と記述するだけで構いません。
文字列型を整数型に変えるには
`int('文字列')`とすることでできます※整数型にする文字列には数値が必要

```py
int_number = int('21')
```
このように書くことで文字列型の数字文字列を整数型の整数値に変えることができます

最後に**実数**について
実数は整数とは違う数値を実数といいます(語弊あり)代表的なものとして小数があります
`1.8`は無論実数型ですが`.25`や`10.`など`.`が含まれる数値は自動的に実数型として認識されます
例を出すと

```py
real_num = 10.
```
これでも実数として認識されるということです

##値の型を確認するには？
結論だけ先に言っちゃうと`type()`を使うことで確認できます
それに先ほどの`print()`を組み合わせることで出力できます
`print()`は察しのいい方は気づかれたかもしれませんが**コンソール上に値を出力する**ために使います
出力するものは`print()`の()内に書いてください
これは**組み込み関数**というものであらかじめ定義されているスクリプトだと思ってください
`type()`も同じく**組み込み関数**です
では早速型を確認しましょう

```py
print(type(fruit))
print(type(num))
print(type(real_num))
```
これを先ほどのコードの下に書いて実行してみてください

```
<class'str'>
<class'int'>
<class'float'>
```
と出力されたならそれは正しいです
`float`というのは実数を指すのできにしなくてOKです！
これが確認出来たら先ほどの`int_number`がちゃんとint型になってるかも確認しましょう
(じぶんでやってみよう！）

##一気に変数を代入したい！(複数同時の代入)
`first_name`に`スズキ`を`second_name`に`タロウ`を一気に代入してみましょう
一気に代入するには
`<変数1>,<変数2> = <値1>,<値2>`
と記述することで可能です
実際にやってみましょう

```py
first_name, second_name = 'スズキ','タロウ'
```
これで代入できたはずです
`print()`を使って確認してみましょう

```py

print(first_name)
print(second_name)
```
どうでしょう...

```
スズキ
タロウ
```
と出力されましたでしょうか

##算数をやってみよう(算術演算子)

算術演算とは足し算や引き算、割り算などを指します

| 演算       |       記号 |
|:-----------------|------------------:|
| 加算(足し算)             |              + |
| 減算(引き算)           |            - |
| 乗算(掛け算)             |              * |
| 除算(割り算)             |/|

具体的にと申しますと

```py
print(1+1)
```
と入力すると

```
2
```
と出ます
また
`str`+`int`はできませんが
`str`+`str`は可能です実際にやってみましょう

```py
print('Hello'+'World')
```
これを実行してみてください
`HelloWorld`と出力されたら成功です！
また`int`+`float`も可能で、答えは`float`になります

##累積代入文(what?)
累積代入文は変数を更新する際に便利です
いままでは

```py
score = 1
score = score + 1
print(score)
#出力結果:2
```
このようになりますがこれを簡略化することができます！

```py
score = 1
score += 1
print(score)
```
これを実行すると２出力されるはずです
このように`+=`を使うことで簡略化することが可能です
これを**累積代入**と呼びます

##比較演算子
**比較演算子**とは演算子の右と左において演算子の指定した条件を満たしているかを確認します
確認するには`bool`という型を使います`bool`は`True`,`False`の二つのみで構成されます
条件を満たしているなら`True`が返ってきて
満たしていないなら`False`が返ってきます

| 演算       |       記号 |
|:-----------------|------------------:|
| 小なり             |              < |
| 大なり           |            > |
| 以下             |              <= |
| 以上             |>=|
|等しい|　==|
|等しくない| !=|

例えばこれを実行してみてください

```py
print(1 == 2)
```
これを実行するともちろん1は2と等しくないので`False`と出力されるはずです
これを使って慣れたら次に進みましょう！

##エスケープシーケンス
**エスケープシーケンス**って何ぞや？となったと思います。
Tutorialにも書いてありますが、これはその表し方以外表現できないので引用しますと
>通常の文字列では表せない特殊な文字を、規定された特別な文字の並びにより表したものをエスケープシーケンス (escape sequence) と呼びます。

例えば、改行したいときどーすりゃいいの？その答えはエスケープシーケンスです百聞は一見に如かずということで以下を実行してください

```py
print('Hello\nWorld')
```
このコードを見て「そりゃ`Hello\nWorld`と出力されるに決まってるだろ」
と思った人騙されたと思ってください
結果は

```
Hello
World
```
な、なんと改行されているではないか！
それをエスケープシーケンスと呼ぶのです
他には`\t`はタブを意味します
これは**普通に文字列として使うことができます**

##文字列メソッド
**メソッド(method)**とは...
メソッドは`str`などの型が持つ関数を指します関数は多少語弊がありますが**機能**
と捉えてください(最初のうちはそれで大丈夫なはずです👍)
ここでは事前に

```py
name = 'HelloWorld'
```
と定義してください
今の時点では

```py
print(name)
```
を実行すると`HelloWorld`が出力されます
では

```py
print(name.lower())
```
を実行してください
すると`helloworld`と出力されるはずです
`lower()`は**全ての文字を小文字にする**という機能を持っています
また`lower()`の部分を`upper()`に変えて再度実行してみてください
`HELLOWORLD`と出力されるはずです
`upper()`は`lower()`の逆で**すべての文字を大文字にする**機能を持ちます

それ以外には`format()`メソッドがあります
これは
**ある文字列の一部分に、あとから別の文字列を埋め込む**ために使用します。
そして文字を埋め込みたい場所には`{}`を置いておきます
形としては

```py
word = 'Hello'
print('{}World'.format(word))
```
これを実行すると`HelloWorld`が出力されるはずです
`word`で定義した`Hello`がformatで埋め込む文字列として指定され
埋め込む場所に`{}`を置いたWorldの前が指定されたというわけです
これを使う利点として
**`format()` メソッドを用いると `int 型` や `float 型`の変数を、`str 型`へ明示的にキャストすることなく文字列に埋め込むことができます。**

##浮動小数点数(float)だけが持つメソッド
`float`型だけが持つメソッドとは`as_integer_ratio()`というものがあり
これは少し語弊があるかもしれませんが、float型の小数を(分子,分母)の形にすると考えてください
例えば

```py
print(0.5.as_integer_ratio())
```
`(1,2)`と出力されたら完璧です👍

#複合データ型
今まで扱ってきた**変数**には一つの値しか代入できませんでしたが
以下のものには複数の値を扱うことができます

- リスト(list)
- タプル(tuple)
- 辞書(dict)

そして、今からこれを一つずつ説明していきます

##リスト(list)
>list型を定義するには`,`で区切り、`[]`で値を囲います

```py
fruits = ['apple','banana','orange','grape']
```
型を確認してみましょう

```py
print(type(fruits))
#listと出力されるはず
```

###リストの要素数(長さ)を確認しよう!
リストの長さとはリストに入っている値の個数を指します
ex)上で定義した`fruits`は`apple`,`banana`,`grape`,`orange`の4つです
これを取得するには`print()`や`type()`と同じ組み込み関数の**`len()`を使います**
`len()`は()内に指定したリストの要素数を返します
以下のコードを書いてみましょう

```py
print(len(fruits))
```
を実行してみてください
`4`と出力されるはずです

###リストを操作しよう！(要素へのアクセス編)
要素へのアクセスに必要なものとして何番目の要素にアクセスするかです。
その何番目のことを**インデックス**といいます
インデックスは一番初めの要素のインデックス番号を`0`とし`1`,`2`となります
※一番最初は1じゃないよ！
たとえば`furuits`のインデックス番号が`2`の要素は`orange`です
指定したインデックス番号の要素へアクセスするには**`list名[インデックス番号]`**という風に記述します
それでは指定したインデックス番号の要素を出力してみましょう

```py
print(fruits[2])
```
`orange`と出力されたらそれは正解です！

###リストを操作しよう(要素の値を更新しよう編)

リストの要素の値を更新するには
上記の要素へのアクセスを使用します

```py
fruits[2] = 'peach'
print(fruits[2])
```
これを実行して`peach`が出力されたら完璧です！
因みに初めからの要素のアクセスにはインデックス番号を正の数に指定しますが、
末尾からのアクセスには負の数を使います[-1]は末尾を指します
※末尾からのインデックス番号のスタートは`-1`であって`0`じゃない！
因みにリストには`str`や`int`も代入できます`list`自体も代入できます
###リストに値を追加しよう
リストに値を追加するには`append()`のメソッドを使用します

```py
fruits.append('lemon')
print(fruits)
```
を行ってください`lemon`が出力されたら完璧です

##タプル(tuple)
>タプルを定義するには`()`で要素を囲み`,`で要素を区別します

タプルはリストと違って、値を更新したり代入したりすることができません

```py

foods = (bread,rice,fish)
print(foods)
```
これを実行すると`(bread,rice,fish)`と出力されます
値を追加しようとしてもいいですが当然エラーが出ます

##辞書(dict)
辞書は上の二つと違い`key:value`の形で記録されます
辞書に関しては[チュートリアル](https://tutorials.chainer.org/ja/02_Basics_of_Python.html#%E8%BE%9E%E6%9B%B8)が一番わかりやすいと思うので私が説明するよりは参照になります

#制御構文
ついにここまで書きました！
制御構文には二種類あります

- 条件分岐(if)
- 繰り返し処理(for,while)

##条件分岐(if文)
ifは日本語に訳すと`もし`ですその言葉通り条件式を満たすか満たさないかで処理を変えます!

```py
if 条件式:
    条件式を満たすときの処理
```
このように記述します
※`:`を忘れずに！
例を挙げます

```py
a = 1
b = 2
if a == 1:
    print('aは1だよ!')

if b != 1:
    print('bは1じゃないよ')
```
これを実行してみてください。
二つともTrueなので両方出力されるはずです！

###ifで条件を満たさない時の処理は？
その場合`elif 条件式:`と書いてください
elifにも満たさない場合の処理は`else:`を使ってください
これには条件も何もないので条件式をは不要です

```py
a = #好きな値を入れてね
if a == 1:
    print('aは1だよ!')
elif a < 1:
    print('aは1より小さいよ!')
else:
    print('aは1より大きいよ!')

```
これでaにいろんな値を代入して勉強してください!

##for文,while文
これは辞書と同じく画像を使って説明している[チュートリアル](https://tutorials.chainer.org/ja/02_Basics_of_Python.html#%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%EF%BC%88for-%E6%96%87%EF%BC%89)が一番わかりやすいです

(決してめんどくさがってるわけじゃないよ!)

----
#関数
ここからは関数を3段階に分けて説明します
##step1
###Pythonにおける関数とは
結論から言っちゃうと**関数**を使うことで様々処理を一つにまとめることが可能です!
簡単に例を出し説明させていただきますと
>例えば電子ヒーターを考えてみましましょう...私の家で使ってるヒーターの機能には
>>①起動する時間を指定する
②周りを温める
③指定した時間が経過したら温めるのをやめる

という過程があります
このヒーターのように**様々な処理が機能として１つにまとまっているものをPythonでは関数といいます。** **(Python以外の言語でもいう場合があるのでこれから重要になります)**
![関数.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600026/00acc59c-b18f-47bb-5d42-d39e2948643a.png)
この関数を使うことで一回一回①...②...③といった感じで書かなくても
`ヒーター`を使う(用語では**関数を呼び出す**という)ことで定義した処理を一括で行ってくれる

###関数を定義する
関数の意味を理解していただけたかと思います。
それでは`ヒーター`の機能を関数にしていきましょう
関数を定義するには
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600026/045c27cb-08e1-ea40-c1d7-5e835f7b80aa.png)
最初に関数名を決める必要があります
今回は`ヒーター`を定義するので`heat()`を定義しましょう

```py
def heat():
    print('空気を温めるを指定しました')
    print('周りを温めています')
    print('時間になったので温めを止めました!')
```
はい、これで機能を定義できましたが、この状態で実行しても
何も起こらないはずです
いまはあくまで、関数を定義した、つまりヒーターを作っただけで、電源を入れなくては(関数を呼び出さなくては)動きません

###関数を呼び出そう!
関数を呼び出す方法は`関数名(引数)`とする必要がありますが
今回引数は不要です
※引数についてはあとで説明します

```py
heat()
```
これを実行すると

```
空気を温めるを指定しました
周りを温めています
時間になったので温めを止めました!
```
となるはずです!
これでヒーターを動かせました。

##step2
###モード設定をしよう！(引数について)
今まで使ってきたヒーターでは時間指定をしてきました...
一旦その機能をなくして`弱`,`中`,`強`のモードを指定したいということで
**引数**というものを使っていきます
説明はあとでしますので一旦ソースコードを見ましょう

```py
def heat(mode):
    if mode == '強':
        print('強モードだよ!')
    elif mode == '中':
        print('中モードだよ!')
    elif mode == '弱':
        print('弱モードだよ!')
    else:
        print('モード選択が間違ってるよ！')

#xxの部分に弱、中、強のいずれかまたはそれ以外を入れて実行して(文字列型で)
heat(xx)

```
結局引数ってなんなん？って思った人もいると思います
>引数とは
heatの関数を呼び出す際に渡されたデータを`mode`という変数に入れておくことができます!
引数を使うには上記のように`def 関数名(引数)`といったように関数を定義してください

`def 関数名(引数1,引数2...)`といった感じで引数を複数指定することができます
引数を使うことで関数内でも引数に入っているデータごとに処理を分けることができます

###戻り値について
戻り値というのはデータを返してくれるものです
下記のソースコードを例に出していきます

```py
def square(long):
    area = long*long
    return area
#returnされたデータを直接出力することができる
print(square(10))

#returnされたデータを変数に代入することもできる
square_area = square(3)
print(square_area)
```
今回は(`long`)に指定された正方形の一辺の長さから正方形の面積を返す関数を書きました
ソースの三行目の`return`は戻すや返すという意味があり、`return`の右側に書いたデータを返すことができます。
イメージはこんな感じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600026/56dedd39-7473-f9c3-07b4-a6b137df16cb.png)
この戻り値はよく使うので読み返して理解しておいてください

##step3
###自分で関数を書いてみよう!
円の面積は半径×半径×3.14で求めることができます。
**`circle`という関数を定義し引数には`radius`を指定してください**
>
>>円は半径が負の数(0以下)になることはあり得ないので、
**`radius`が0以下の場合`'エラーがでちゃった!'`を返す**

>>**0以上の場合`radius`に指定された値が半径となる円の面積を返す**
関数外に`return`された値を出力するコードを記述してください

答えは一番下の項目に記述しておきます


#fizzbuzz問題
for文までを使い以下の問題を解いてください!
関数まで理解できた方は出力と処理を分けて書いてみてください!
>1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに｢Fizz｣と、5の倍数のときは｢Buzz｣とプリントし、3と5両方の倍数の場合には｢FizzBuzz｣とプリントすること。

これの答えは次回掲示します

#いよいよ離陸!クラスについて
###最後の関門
関数までコンプリート出来た読者の皆さんなら
最後のボスを倒してくれると思います！
ただ、私自身クラスを理解するまで相当時間がかかりました。
一回で理解できるように私なりに工夫をするので諦めずについてきてほしいと思います

##クラスの基本のキ
###オブジェクト指向って？
まずクラスを理解するには`オブジェクト指向`の考えについて学ぶ必要があります。
プログラミングの種類というのは大きく分けて3つあります
その3つある中の一つに`オブジェクト指向プログラミング`(以下:oop)があり、それにPythonも含まれます

oopとは...
>モノ(object)を組み立てるように表現して、コンピュータに動作をさせる

oopの一番のメリットは**わかりやすくプログラムを表現できるということ**

つまりPythonにおけるclassや関数は全てオブジェクトであります
今回は`オブジェクト`という言葉を`モノ`に置き換えてお話しします
文字に素直になって読み進めてください`モノだから...オブジェクトに置き換えよう!`ということはしなくても伝わるように記事を書かさせていただきます
###クラスとは・構造
クラスというのは`モノ`を作るために必要な設計図に当たります
ただしここで注意しなくてはいけないのは**あくまで設計図である**ということです
設計図から`モノ`を作るには別の工程が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600026/e7a7f5d3-751a-ec70-bdc9-464bd5059442.png)
今回は`Heater`を定義しましょう！
そしてHeaterの機能は
①ヒーターの状態を確認する
②ヒーターの状態を更新する
※状態→power(on,off)/mode(強,中,弱)/timer(number)

```py

class Heater():
    def __init__(self,power=off,mode=None,timer=None):
        self.power = power
        self.mode = mode
        self.timer = timer

    def check(self):
        print(f'ヒーターは{self.power}で、モードは{self.mode}、タイマーは{self.timer}に指定されてます')

    def update(self,power,mode,timer):
        self.power = power
        self.mode = mode
        self.timer = timer

```
クラスの定義はこんな感じです
`checkメソッド`はヒーターの状態を確認する
`updateメソッド`はヒーターの状態を更新する
それでは、このヒーターを作るためのクラス(設計図)について理解しましょう
###selfとは？
クラス内のメソッドにおける第一引数には絶対に`self`が含まれています
selfとは**自身**を示すものです
ヒーターは同じ製品が複数あるものの勿論ヒーターそれぞれ状態が違います
`ヒーターA`はonでモードは弱,タイマーは10であっても
`同製品ヒーターB`はonでモードは強,タイマーは5である
`self`はAからみた自身つまり、Aとpower,mode,timerを紐づけます
BのpowerはオンでもAとは紐づいていないのでAもオンになるということはありません
そしてclass内のメソッドには必ず第一引数にselfを使う必要があります

###\___init___とはなーに？
Heaterクラスには`__init__`というメソッドが定義されていますこれは
予め定義されている特別なメソッドの一つで
クラス(設計図)からモノを作るときに自動的に呼び出されるもので**初期設定**と思ってください
Heaterクラスでは`__init__`内の引数で渡された順に`power`,`mode`,`timer`
を先ほど解説したself(製品のモノ(インスタンス))ごとに紐づけるという処理を行っています

##クラスの基本のホ
###モノを作ろう(インスタンス化)
インスタンス化するには

```py
heater = Heater(on,'弱',100)
```
という感じに`クラス名()`とし、`()`内に引き渡された値を`__init__()`メソッドに直接引き渡します。これでヒーターの設定は完了ですそれでは`check`メソッドを使って上記のコードに渡した値が代入されたか確認しましょう

```py
heater.check()
```
を実行してみましょう
最初に設定した通り
ヒーターはonで、モードは弱、タイマーは100に指定されてます
という感じで出力されたら完璧です!

因みに`self`はインスタンス化する際に呼び出す必要はありません

##クラスの基本のン(継承)
(編集中)






        










#アンサー
##circle関数

```py
def circle(radius):
    if redius >= 0:
        area = radius*radius*3.14
        return area
    else:
        return 'エラーがでちゃった!'

print(circle(x))
```