Python入門：特徴、基本文法、関数、クラス　（〜B3に向けて〜 part1）

#Pythonとは？
* Pythonの特徴

|動的な型付け|型宣言をプログラム実行前にしなくて良い|
-----|-----
|**ガベージコレクション**|不要なメモリは自動的に解放|
|**マルチパラダイム**|オブジェクト指向、命令型、手続き型、関数型など複数の特性を併せ持つプログラミング言語|
|**外部ライブラリが豊富**|機械学習用の「TensorFlow」「Chainer」や<br>Web開発用の「Django」「Flask」など様々|
|**読みやすい**|簡単な短いコードによって書けて読みやすい|
|**多くのプラットフォームに対応**|Windows,Mac,Linux,ios,Android...|

##C言語でのプログラム実行まで
たった１行の出力でもいろいろしなくちゃいけない...
＊もちろんC言語も高速であったり自由度が高かったりと優れているところがたくさんあります。

```c:Hello.c
//ライブラリの読み込み
#include <stdio.h>
//main関数の定義
int main(int argc, char *args[]){
    printf("Hello, world!\n");
    return 0;
}
```

```console
$  gcc -o hello hello.c　　　　　　　//コンパイル
$  ./hello　　　　　　　　　　　　　　 //実行
Hello, world!
$
```

##Pythonでのプログラム実行まで
たったこれだけで動きます。
Pythonはインタプリタ言語といって
コンピュータがプログラミング言語を機械語に翻訳する作業を
プログラム実行時に同時作業で行ってくれます。
これにより、機械語への変換を一括で行うコンパイルという作業の指示をする必要がありません。

```python:Hello.py
print("Hello, world!")
```

```console
$ python Hello
Hello, world!
```
----------

#実際に書いてみよう！
[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)
* ファイルをクリック
<img width="1277" alt="スクリーンショット 2020-03-09 14.16.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462398/a9dd1a7c-6566-3aa1-b9ee-d413ac99a09f.png">
* ノートブックを新規作成をクリック
<img width="740" alt="スクリーンショット 2020-03-09 14.18.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462398/0fbd07fb-2e56-2318-7111-9778e5541857.png">
* 以下のコードを記入

```python
print("Hello, world!")
```
<img width="350" alt="スクリーンショット 2020-03-09 14.23.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462398/47cc63cb-f11a-807f-9484-6786440113f6.png">

* :arrow_forward: ボタンを押す

<img width="390" alt="スクリーンショット 2020-03-09 14.24.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462398/e941c968-49fe-71b8-8500-41f1d3e50bb8.png">

##変数を使ってみよう
```python
msg = "Hello, world!"
num = 100
ADMIN_EMAIL = "hello@mail.com"
squares = [1,4,9,16,25]
print(msg)
print(num)
print(squares)
print(ADMIN_EMAIL)


msg = "I'm Pretender"
num = num + 50
squares += [36, 49, 64, 81, 100] 
print(msg)
print(num)
print(squares)
```

```text
Hello, world!
#numの出力
100
#squaresの出力
[1, 4, 9, 16, 25]
#ADMIN_MAILの出力
hello@mail.com
#更新後のmsgの出力
I'm Pretender
#更新後のmsgの出力
150
#更新後のsquaresの出力
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
```

##数値の四則演算など

```python
x = int(input("x="))
print(x+3)
print(x-3)
print(x*3)
print(x/3)
msg += "GoodBye!"
print(msg)
```

##文字列に値を埋め込む
```python
name = "Iwana"
height = 173
#やり方１　文字列フォーマット指定
print("%sくんの身長は、%dcmです。"%(name,height)) 
#やり方２ {}で指定
print("{1}くんの身長は、{2}cmです。".format(name,height))
```

|フォーマット指定子|型|
|:-----:|:-----:|
|%d|整数|
|%f|浮動小数|
|%s|文字列|
|%o|8進数|
|%x|16進数|

[フォーマット指定子のサイト](http://pract.webcrow.jp/pages/contents/python/print-formats)

>課題
>>名前とBMIを計算して表示するプログラムを書いてみよう。
ex) 身長170cm,体重70kg
BMI=体重[kg] ÷ (身長[m])^2

##条件分岐をしてみよう
###if文

```python
score=int(input("score?"))
if score >= 90:
    print("A+")
elif score >= 80:
    print("A")
elif score >= 70:
    print("B")
elif score >= 60:
    print("C")
else:
    print("You're failed.")
```

Pythonに限らずプログラミング言語では基本的に

```
if 条件式:
　　実行文
else:
　  実行文
```
のようにif文などを書いていきます。

　if分では条件演算子を用いて数値や文字の比較をする式(**条件式**)を用いて、
その条件が真(**True**)だった時に配下に書いた実行文に移ります。
もし条件式が偽(**False**)だった時は次の文(elif,elseなど)に移ります。

最初の条件式のときに**if**を用い、他に分岐させたい項目がある場合は**elif**を用います。
ifやelifの条件から外れた物への指示は**else**文の配下に記述します。

条件演算子には次のようなものがあります。

| 演算子 | 意味 |
|:--:|---|
| >  | 左側の数が、右側の数よりも大きい |
| < | 左側の数が、右側の数よりも小さい |
| == | 両辺の数値の大きさが等しい |
| != | 等しくない |
| >= | 左側の数が、右側の数よりも大きいか、または両辺が等しい |
| <= | 左側の数が、右側の数よりも小さいか、または両辺が等しい |

また条件を掛け合わせる時にはブール演算子を使うと便利です。


| 演算子 | 意味 |
|:--|:--|
| and | 両方とも成り立つ。 |
| or |少なくとも、どちらか一方は正しい。 |

```python:if_sequence.py
day = int(input("What's the date today ? "))
week_of_day = input("What day is today ? ")

if (day==13)and(week_of_day=="Friday") :
    print("Jason will come.")
else:
    print("Jason will not come.")
```

条件分岐は１行でも記述することができます。

```python
score = int(input("score ?"))
print ("Good Score!" if score >= 70 else "Not Good Score...")
```

>課題
>>BMIを判定するコードを書いてみよう

|BMI値|判定|
|:-:|:-:|
|18.5未満|	低体重(痩せ型)　|
|18.5〜25未満|	普通体重|
|25〜30未満|	肥満(1度)|
|30〜35未満|	肥満(2度)|
|35〜40未満|	肥満(3度)|
|40以上|	肥満(4度)|

##繰り返しをしてみよう
繰り返しにはfor文とwhile文の2種類があります。
###for文
　for文は以下のような文法で成り立っています。
ここでデータの集合とは１〜９の数字の集合であったり、配列であったり、
ファイルの集合であるフォルダであったりします。

```
for 変数 in データの集合:
    実行文
```
実際にfor文を使ってみましょう。
今回はデータの集合に0~9の数字の集合を使うことで10回の操作を繰り返します。
0~9までの数字の集合には組み込み関数のrangeを用います。

```python:count.py
for i in range(0,10):
    if i == 5:
        print("a")
        continue
    """if i == 9:
        break"""
    print(i)
```

`i==5`の時以外は0~9までの数字が出力されました。`print(i)`が動いてますね。
`i==5`の時だけ`a`が出力されました。if文の中に入っていることがわかります。
if文の最後の行に`continue`と書いてあります。
`coutinue`文に当たると現在進行中の繰り返し処理一回分を終了させて
強制的につぎの繰り返し処理に入っていきます。
なので`i==5`の処理時には`continue`以降の`print(i)`が実行されていません。

この他にも`break`文というのもあります。
これは繰り返し自体を終了させてしまいます。
`i==9`のコメントアウトを外して実行すると出力が`8`までになるはずです。

###while文
while文の文法は以下のようになっています。

```
while 条件式:
    実行文
```
while文では条件式が真(**True**)である限り実行式が繰り返し実行されます。
for文と同じプログラムを書いていきましょう。

```python
i = 0
while i < 10:
    if i == 5:
        print("a")
    elif i == 9:
        break
    print (i)
    i += 1
```




##関数

　Pythonでは関数の定義も行うことができます。

```math
f(x,y) = 2x + y
```
を出力するような関数を作ってみます。

```python
def function(x=0,y=0):
    print("2x+y=%f"%(2*x+y))

x = int(input("x="))
y = int(input("y="))
function(x,y)

```
このように関数は

```
def 関数名(引数):
    実行文
```
のような文法で記述されます。引数は何個でも大丈夫です。
引数にはデフォルトの値を入れることができます。
関数を呼び出した時に引数の場所に値を入れていないとデフォルト値を入れた状態で実行されます。

##返り値がある場合
`return`文を使うことで関数の返り値を設定できます。

```py
def function(x,y):
    return 2*x + y
x = int(input("x="))
y = int(input("y="))
print("2x+y=%f"%(f(x,y)))

```

>課題
>>任意の値(n)までのフィボナッチ数列を出力する関数を作ってみましょう。

>課題２
>>入力を身長、体重としてBMIを返すような関数を作ってみましょう。

##スコープ
　プログラムの変数、（メソッド、クラス名）には有効範囲があります。これをスコープと呼びます。
スコープは対象を宣言した場所によって変わります。
スコープは３種類に分けられます。

|スコープ名|意味|
-----|-----
|ビルドインスコープ|Pythonプログラムの中に常に存在するスコープ|
|グローバルスコープ|作成するPythonファイルやプロジェクト内で有効|
|ローカルスコープ|関数内でのみ有効|

スコープの大きさは、
ローカルスコープ&#x2282;グローバルスコープ&#x2282;ビルドインスコープ
になっています。スコープの外側からは、その名前を参照できません。

##クラス
　クラスの構造は次のようになっています。
クラスとはデータ構造を作る仕組みで、クラスを使うと新しいデータ型を作ることができます。

```py

class Personal_data():
    #コンストラクタの定義
    def __init__(self, name, age, weight, height): 
        # インスタンス変数（属性の初期化）
        self.name = name
        self.age = age
        self.weight = weight
        self.height = height
        print("コンストラクタが呼ばれました")

    def hello(self):
        print("Hello, " + self.name)
    def BMI(self):
        print(self.weight/(self.height/100)**2)

    #デストラクタの定義
    def __del__(self):                            
        print('デストラクタが呼ばれました')
# iwanaというインスタンスを生成しています。
iwana = Personal_Data("Hiroki",23,65,170) 
iwana.hello()
iwana.BMI()
del iwana
```
　このようにクラスには変数や関数といった様々なものを入れることができます。
クラスの中に定義された関数をメソッド、クラスが内包しているデータを属性と呼びます。
クラスや関数は定義しただけでは何も行われません。
クラスや関数などを実際に使う状態にすることを**インスタンスの作成**と呼びます。
　コンストラクタはクラスのインスタンスが作成される際に一度だけ呼ばれるメソッドです。
今回では`iwana = Personal_Data("Hiroki",23,65,175)`のときにParsonal_Dataクラスのインスタンスが作成され、そのオブジェクトを変数`iwana`に代入しています。
オブジェクトとは属性とメソッドを持ったもののことを指します。
　コンストラクタとは別にクラスの特殊なメソッドとして、デストラクタがあります。デストラクタは呼び出された時にインスタンスを削除します。

>課題
>>自分で好きなクラスを作ってみよう！