元iOSエンジニアの自分が、我妻先生の「みんなのKaggle講座」のPython基礎で特に学びになったことをまとめてみた

Udemyの我妻先生の[「みんなのKaggle講座」](https://www.udemy.com/course/learning-kaggle/) を受講させていただきました。
大変わかりやすかったので、Kaggleに取り組んでみたいと思われているみなさんにおすすめです。この記事を見て、少しでも気になった方はぜひ購入してみてください。

自分は元iOSエンジニアということもあり、Pythonの書き方がなれていなかったので、
Pythonはこのように書くのかと、特に学びになったことをまとめさせていただきます。
誰かの学びになれば幸いです。


#### 学びになったこと
* 論理演算子の書き方
* リスト
* タプル
* for文
* クラスのself
* ファイルの保存と読み込み
* __init__メソッド
* __call__メソッド





## 論理演算子の書き方
Pythonでは、論理演算子を **「and」** **「or」**  **「not」** と直接、文字で記載します。
&&とかでは記載しません。

``` Python
a = 3
b = 4
c = 5

d = a < b and b < c  # 両者があっていればTrue
print(d)

e = a < b or b > c  # 片方でもあっていればTrue
print(e)

f = not a < b  # TrueやFalseを反転させる
print(f)
```

出力
``` Python
True
True
False
```

## リスト
pythonのリストは、複数の値をまとめたいときに使用します。
全体を[]で囲みます。

``` Python
a = [2011,2012,2013,2014,2015]

print(a[0])
print(a[1])
print(a[2])
```
出力
``` Python
2011
2012
2013
```

#### データ型がばらばらでも問題ない

``` Python
b = 2016
c = [b, 2017, 20.1, "Hello", "Hi"]
print(c[1:4])
# c[1:4]は1から4未満(1,2,3)を表している

```

出力
``` Python
2017
20.1
'Hello'
```

#### リストの中にリストを格納できる

``` Python
d = [[2012,2013,2014], [2015, 2016, 2017]]
print(d[0])
```

出力
``` Python
[2012, 2013, 2014]
```


#### リストは作成後に要素を追加したり、変更することができる

``` Python
e = ["Py", 543.21, 79, "thon", [2018, 2019, 2020]]
print(e)

e[2] = 99
print(e)

e.append(2021)
print(e)
```

出力
``` Python
['Py', 543.21, 79, 'thon', [2018, 2019, 2020]]
['Py', 543.21, 99, 'thon', [2018, 2019, 2020]]
['Py', 543.21, 99, 'thon', [2018, 2019, 2020], 2021]
```

## タプル
タプルとは、リストと同じく複数の値をまとめて扱いたときに利用します。
ただ、リストと違って、要素の追加や削除、入れ替えを行うことはできません。
タプルは全体を()で囲み、各要素を, で区切ります。
要素を変更する予定がない場合は、リストよりもタプルを使用するほうが良いです。

``` Python
# 練習用
a = [2012, 2013, 2014]
b = (2012, 2013, 2014)

print(a)
print(b)
# 出力
# [2012, 2013, 2014]
# (2012, 2013, 2014)


print(a[1])
print(b[1])
# 出力
# 2013
# 2013

a[1] = 2016
print(a)
# 出力
# [2012, 2016, 2014]

b[1] = 2016
print(b)
# 出力
# エラー

a.append(2015)
print(a)
# 出力
# [2012, 2016, 2014, 2015]

b.append(2015)
print(b)
# 出力
# エラー
```

## for文
for文でループするときに、連番の整数を使う場合は、range関数を使用する。
以下では、iに0から5までの整数が入る場合

``` Python
for i in range(0,6): # rangeで0以上6未満の整数が入る
    print(i * 2)
```

出力
``` Python
0
2
4
6
8
10
```


## クラスのself
関数とは異なり、クラスの中で定義するメソッドの最初の引数にはselfと書く必要があります。

このselfを用いて、インスタンスは値を保持することができます。
インスタンス内で値を保持する変数を、インスタンス変数といいます。


``` Python
class Box:
    def set_number(self, n1, n2):
        self.num1 = n1 
        self.num2 = n2
        # num1, num2がインスタンス変数

bx = Box()
bx.set_number(123,456)

print(bx.num1)
print(bx.num2)

bx.num1 = 999
print(bx.num1)
```

出力
``` Python
123
456
999
```


#### インスタンス変数は、インスタンスごとに異なる値を設定することができる

``` Python
class Dog:
    def set_dog(self, n, a):
        self.name = n
        self.age = a

dog1 = Dog()
dog1.set_dog("Pochi", 5)

dog2 = Dog()
dog2.set_dog("Hachi", 12)

dogs = [dog1, dog2]
for d in dogs:
    print(d.name, d.age)
```

出力
``` Python
Pochi 5
Hachi 12
```


## ファイルの保存と読み込み
with構文を用いて、ファイルの読み込みや保存を簡単に記述できます。

``` Python
greetings = "Good morning! Good night!"

with open("greetings.txt", "w") as f:
    f.write(greetings)
# wはファイルへの書き込み(write)を表す
```

上記で保存されたファイルを読み込んで、表示もできます

``` Python
with open("greetings.txt", "r") as f:
    print(f.read())
# rはファイルの読み込み(read)を表す
```


## __init__メソッド

__init__メソッドは、イニシャライザ、もしくはコンストラクタと呼ばれています。
このメソッドは、インスタンスの生成時にインスタンスの初期設定を行うことができます。


``` Python
class Calc:
    def __init__(self, a):
        self.a = a

    def add(self, b):
        print(self.a + b)
    
    def multiply(self, b):
        print(self.a * b)
```
以下で、引数3を渡したインスタンスを生成しています。

``` Python
cl = Calc(3)
cl.add(4)
cl.multiply(4)
```
出力
``` Python
7
12
```


## __call__メソッド
__call__メソッドは、インスタンス名を使って呼び出すことができます。

``` Python
class Calc:
    def __init__(self, a):
        self.a = a
    
    def __call__(self, c):
        print(self.a * c + c)
    
    def add(self, b):
        print(self.a + b)
    
    def multiply(self, b):
        print(self.a * b)
```

インスタンスを使って、__call__メソッドを呼び出せます

``` Python
cl = Calc(3) # インスタンスを生成。__init__メソッドの引数aに3を渡している。

cl(5) # __call__メソッドの引数cに5を渡している
```
出力
``` Python
20
```


このように、__call__メソッドを使えば、メソッド名を記述する必要がなくなります。
頻繁に用いる処理は__call__メソッドで記述しておくことで、コードの記述量が少なくすむようになります。

 


## まとめ
Pythonに慣れていない人は、上記のことさえ覚えればだいぶ読みやすくなると思います。
Kaggleでメダルを取得するために、まずはkaggleのPythonのnotebookを読めるようになるようになるのが大事だと思います。
上記に共感している方は、Udemyの我妻先生の[「みんなのKaggle講座」](https://www.udemy.com/course/learning-kaggle/) は大変参考になると思うのでおすすめです。
最後まで読んでいただき、ありがとうございました！