初学者がPythonについてまとめる

# はじめに
プログラミング初学者が自分なりにPythonについてまとめてみた。
もし間違っていることを書いているようならご指摘いただけると幸いです。

# Pythonとは
Pythonはオブジェクト指向プログラミング言語と呼ばれており、少ないコードで簡潔にプログラムを書ける。
[公式ドキュメント](https://docs.python.org/ja/3/)
![スクリーンショット (27).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2001115/c1b83934-1b87-97ac-2b6e-cb033155d61c.png)

# Pythonでできること
- AI(機械学習・深層学習)
- Webサイト作成
- ゲーム制作
- Web上の情報収集ツール(スクレイピング)
- データ処理・分析・解析

# 使用例
公式サイトから引用
>
- YouTube
"Python is fast enough for our site and allows us to produce maintainable features in record times, with a minimum of developers," said Cuong Do, Software Architect, [YouTube.com.](http://youtube.com/)
>
- Google
"Python has been an important part of Google since the beginning, and remains so as the system grows and evolves. Today dozens of Google engineers use Python, and we're looking for more people with skills in this language." said Peter Norvig, director of search quality at [Google, Inc.](http://google.com/)

# オブジェクトとクラス
オブジェクトとは、データだけでなく、振る舞い(メソッド)を含み、クラスを定義することによって生成できるもののことである。
クラスではオブジェクトを作成する際の__データ__や__メソッド__を定義する。
classとは、クラスを定義する際の`キーワード(予約語)`である。

クラスもオブジェクトの一種で(pythonはすべてオブジェクト)、クラスから生成したオブジェクトを特別に区別するために__インスタンス__と呼んでいる。

```python:class.py
    class SchoolMember:
        def __init__(self, classes, name, number):
            self.classes = classes
            self.name = name
            self.number = number
```

基本的なクラス定義の仕方はclassの後にクラス名を指定し、def ~~で関数(メソッド)を記述する。
この時、クラス名は大文字から始める。
__コンストラクタ__は、`__init__`という名前で定義するのがルールである。
__コンストラクタ__はオブジェクト生成時に最初に実行される、初期化用の関数のことである。

コンストラクタの第一引数は__self__とし、__self__は__インスタンス__自身を指す。

```python:instance.py
    # インスタンス生成
    school_member1 = SchoolMember(1, 'Taro', 10)
    # インスタンスの参照(instance).(member)
    print(school_member1.classes) # 1
    print(school_member1.name) # Taro
    print(school_member1.number) # 10
    # memberの書き換えも可能
    school_member1.classes = 2
    print(school_member1.classes) # 2
```

クラス内で定義された変数のことを__member__と呼び、今回だと`classes`、` name`、`number`である。

# クラスの継承
`親クラス`の機能をそのまま引き継いだ`子クラス`をクラスの継承と呼ぶ。
クラスの継承には既存のクラスが必要であり、既存のクラスに機能を追加したいときにクラスの継承を行うことで既存クラスに直接書き加えることなくメソッドなどの追加ができる。
クラスの継承元は`親クラス`や`スーパークラス`などと呼ばれ、継承先のクラスを`子クラス`や`派生クラス`などと呼ばれる。

__簡単なクラス継承__

```python:class_inheritance.py
    class Game:
        def __init__(self, name, hardware):
            self.name = name
            self.hardware = hardware

    # 継承先(子クラス)の生成
    class GameChild(Game):
        def __init__(self, name, hardware, category):
            self.name = name
            self.hardware = hardware
            self.category = category

    game1_data = GameChild('Apex', 'PC', 'FPS')
    print(game1_data.name)
    # Apex
```

__super()を使ったクラス継承__

```python:class_super_inheritance.py
    class Game:
        def __init__(self, name, hardware):
            self.name = name
            self.hardware = hardware

    class GameChild(Game):
        def __init__(self, name, hardware, category):
            # 親クラスのコンストラクタの呼び出し
            super(GameChild, self).__init__(name, hardware)
            self.category = category

    game1_data = GameChild('VALORANT', 'PC', 'FPS')
    print(game1_data.name)
    # VALORANT
```

# メソッド
メソッドとは、`クラス内で定義された関数`や`オブジェクトの属性として参照される関数`などのことである。

```python:method.py
    class Friend:
        def __init__(self, year, sex, height, weight):
            self.year = yaer
            self.sex = sex
            self.height = height
            self.weight = weight

        def calculation_BMI(self):
            bmi = round(self.weight / ((self.height / 100) ** 2))
            return bmi

    friend1_data = Friend(20, 'man', 170, 55)
    print(friend1_data.calculation_BMI())
```

# 関数とメソッドの違い
__呼び出し方の違い__
__関数__: 単独で呼び出しできる
__メソッド__: 変数や値に付けて呼び出す

`print()`、`len()`などは単独で呼び出せるので関数である。

```python:function.py
    print("Hello! Taro.") 
    # Hello! Taro.
    print(len(["dog", "cat", "hamster", "fish"]))
    # 4
```

リストに要素を追加する`append()`や文字列を繋ぐ`join()`は変数や値に付けて呼び出すメソッドである。
変数や値の後に`ドット(.) + メソッド`とすることで呼び出すことができる。

```python:method.py
    animal_list = ["dog", "cat", "hamster", "fish"]
    animal_list.append("lion")
    print(animal_list)
    # ["dog", "cat", "hamster", "fish", "lion"]
    animal_list_join = "/".join(animal_list)
    print(animal_list_join)
    # dog/cat/hamster/fish/lion
```

ただし、メソッドはデータ型に紐付いた関数のため、呼び出せる種類はデータ型で異なる。
上記の例の`append()`はリスト型の変数には使えるが辞書型には使えない。
またどちらでも使えるメソッド`pop()`などもある。

# 参考
https://docs.python.org/ja/3/

https://www.internetacademy.jp/it/programming/programming-basic/what-is-python.html

https://blog.codecamp.jp/python-class-2