Pythonの基礎の基礎をまとめ

# はじめに
この記事はPythonの文法の基礎の基礎をアウトプットするために書いた記事です。
Pythonを使うときにこのページを開いてもらえれば幸いです。

:::note warn
本記事のサンプルコードを使用する際はご自身の環境で必ず実行確認を行ってから使用してください。
実行の保証は一切しておりません。
:::

# Pythonの特徴
## 簡潔で読みやすい構文
Pythonは、他の多くの言語に比べて書くコードの量が少なく、非常に読みやすいです。
Pythonは「コードの可読性」を重視して設計されたそうです。
そのため、コードの量はかなり少ないです。
たとえば以下のように書くコードが
```sample.java
System.out.println("出力内容");
```
pythonでは以下のようになります。
```sample.py
print("出力内容")
```
めっちゃ短い！

## インタープリタ型言語
Pythonはインタープリタ型言語であるため、コンパイルを必要とせず、スクリプトを直接実行できます。
これにより、開発の反復が速くなり、デバッグが容易になります。

:::note info
インタプリタ型言語とは、プログラミング言語で記述されたソースコードを、コンピューターが機械語の形式（オブジェクトコード）に逐次翻訳しながら実行するプログラミング言語です。ソースコードを1行ずつバイナリコードに翻訳してプログラムを実行するため、「逐次翻訳型」とも呼ばれます。
:::

## 豊富なライブラリとフレームワーク
Pythonには、さまざまなタスクを助ける充実した標準ライブラリとサードパーティライブラリがあります。
Django（Web開発）、Pandas（データ分析）、NumPy（数値計算）などがこれに含まれます。

# 基本的なデータ型
## 整数 (int)
整数は、小数点を含まない数値
例: 3, 100, -10

## 浮動小数点数 (float)
浮動小数点数は、小数点または指数（eまたはEを使用）を含む数値
例: 3.14, -0.001, 2e10

## 文字列 (str)
文字列は、シングルクォート（'）またはダブルクォート（"）で囲まれた文字のシーケンス
例: 'hello', "Python3.8"

## ブール (bool)
ブール型は、True または False のいずれかの値
例: True, False

## リスト (list)
リストは順序付けられた要素の集まりで、異なるデータ型を含むことができる
例: [1, 2, 3], ['apple', 'banana', 'cherry']

## タプル (tuple)
タプルは変更不可能なリストとして機能します。一度作成すると、その内容を変更することはできない
例: (1, 2, 3), ('a', 'b', 'c')

## 辞書 (dict)
辞書はキーと値のペアで構成されます。各キーは一意であり、そのキーに対応する値を格納
例: {'name': 'John', 'age': 30}

## セット (set)
セットは順序のない要素の集合で、重複した要素は含まれない
例: {1, 2, 3}, {'apple', 'banana', 'cherry'}

# Pythonにおける型の宣言
Pythonは動的型付け言語であり、変数の型を事前に宣言する必要がありません。
私はこれまでjavaをメインで使用してきたのですが、これが大きな違いでした。
ただ、個人的に型を意識しないというのは良くないと思っています。
理由は簡単でたとえば、数値(int)と文字列(str)を加算演算しようとするとエラーになります。
慣れたエンジニアであれば当たり前のことなのですが、あくまでこの記事は初心者でもわかるようにということで書いているので記載しておきます。

このように関数などを作成する際は以下のようにして型を明記することをお勧めします。
```sample.py
def add_numbers(a: int, b: int) -> int:
    return a + b
```

# 制御構造
## 条件分岐（if文）
if文は以下のように使用します。
日本語だと
aが〇〇の場合は△△という処理
aが◻️◻️の場合は××という処理
それ以外の場合は☆☆という処理
```if.py
if 条件式:
    # 条件式がTrueの場合に実行するコード
elif 別の条件式:
    # 別の条件式がTrueの場合に実行するコード
else:
    # どの条件式もTrueではない場合に実行するコード
```

## ループ
### for ループ
コレクションのアイテムに対して繰り返し操作を行います。
以下の場合、5回繰り返しが行われることになります。
```for.py
# 1から10までの数字を出力
for i in range(1, 11):
    print(i)

# リスト内の要素を出力
fruits = ["りんご", "ぶどう", "バナナ"]
for fruit in fruits:
    print(fruit)

```

### while ループ
条件が真の間、繰り返し実行します。
```while.py
# 1から10までの偶数を出力
i = 1
while i <= 10:
    if i % 2 == 0:
        print(i)
    i += 1

# ユーザーに入力がある限り、入力を続ける
while True:
    name = input("名前を入力してください: ")
    if name == "":
        break
    print(f"こんにちは、{name}さん！")
```
### for ... in ... else
for文でループ処理を行った後に、ループ処理が1回も実行されなかった場合の処理を実行したい時に使用します。

```for ... in ... else.py
# リスト内の偶数の数をカウントする
even_count = 0
numbers = [1, 2, 3, 4, 5]
for n in numbers:
    if n % 2 == 0:
        even_count += 1

if even_count > 0:
    print(f"偶数の数は {even_count} 個です。")
else:
    print("偶数の数はありません。")
```
上記以外にも、break文やcontinue文を使用して、ループ処理を制御することができます。

# 関数
関数は、プログラムの一部をまとめ、名前を付けて再利用できるようにするものです。
関数は、コードを整理し、冗長な記述を減らし、プログラムをより読みやすく、メンテナンスしやすくすることができます。
関数の定義は以下のようになります。
```def.py
def 関数名(引数):
    処理内容
```
関数を呼び出す際は以下のようになります。
```main.py
関数名(引数)
```
これでは少しわかりにくいので実際にサンプルで見ていきましょう。
以下は足し算を行う関数を作成しそれを呼び出して実際に計算を行うものです。
```sample.py
def add(a, b):
  """
  2つの数の合計を返します。

  Args:
    a: 最初の数。
    b: 2番目の数。

  Returns:
    aとbの合計。
  """
  return a + b

# 関数呼び出し
result = add(3, 5)
print(result)  # 8が出力されます
```

## 関数の利点

- コードの再利用
同じ処理を何度も記述する必要がなくなり、コードが簡潔になり、メンテナンス性も向上します。
- プログラムのモジュール化
複雑なプログラムを小さな機能に分けることで、理解しやすくなり、デバッグもしやすくなります。
- 情報の隠蔽
関数の内部の実装を隠蔽することで、プログラムの他の部分から関数の内部を直接操作することを防ぎ、プログラムの安定性を向上させることができます。

# モジュール
モジュールは、関数の他に、変数、クラス、定数などをまとめて、一つのファイルにまとめたものです。
モジュールを使用することで、プログラムを複数のファイルに分割し、コードを整理し、再利用しやすくなります。
以下のようにしてモジュールを呼び出します。
```module.py
import モジュール名
```
モジュール内の要素の使用は以下のように行います。
```sample.py
モジュール名.要素名
```
これだけではさっぱりわからないので実際に使用した例を以下に示します。
mathモジュール（三角関数や平方根などの数学関数を提供するモジュール）を使用した例です。
```sample.py
import math

# 円周率の取得
pi = math.pi
print(pi)  # 3.141592653589793が出力されます

# 平方根の計算
result = math.sqrt(9)
print(result)  # 3.0が出力されます
```

## モジュールの利点
- コードの整理
プログラムを複数のファイルに分割することで、コードを整理し、見やすくすることができます。
- コードの再利用
モジュールをライブラリとして利用することで、他のプログラムで簡単にコードを再利用することができます。
- 名前空間の区別
モジュールごとに名前空間が区別されるため、名前の衝突を防ぐことができます。

# ファイル操作
ファイル操作とは、コンピュータのファイルシステム内にあるファイルに対して、作成、読み取り、書き込み、移動、削除などの操作を行うことを指します。
ファイル操作は、プログラムでデータを保存したり、読み込んだりするために必要不可欠な操作です。

## ファイル操作の種類
ファイル操作には、主に以下の種類があります。

***ファイルの作成***: 新しいファイルを作成し、データを書き込むことができる。
***ファイルの読み取り***: 既存のファイルからデータを読み取ることができる。
***ファイルの書き込み***: ファイルに新しいデータを書き込むことができる。
***ファイルの移動***: ファイルを別の場所へ移動することができる。
***ファイルの削除***: ファイルを削除することができる。
***ファイルの属性変更***: ファイルの作成日時、サイズ、アクセス権などの属性を変更することができる。

## ファイル操作の例
1. テキストファイルの作成と書き込み
```py
with open('test.txt', 'w') as f:
  f.write('Hello, world!')
```
このコードは、test.txtという名前のテキストファイルを作成し、"Hello, world!"という文字列を書き込みます。

2. テキストファイルの読み取り
```py
with open('test.txt', 'r') as f:
  data = f.read()
print(data)
```
このコードは、test.txtという名前のテキストファイルを読み込み、その内容をdata変数に格納し、コンソールに出力します。

3. CSVファイルの読み込み
```py
import csv

with open('data.csv', 'r') as f:
  reader = csv.reader(f)
  for row in reader:
    print(row)

```
このコードは、data.csvという名前のCSVファイルを読み込み、各行のデータをリストとして取得し、コンソールに出力します。

4. 画像ファイルの読み込みと表示
```py
from PIL import Image

# 画像ファイルを読み込む
image = Image.open('image.jpg')

# 画像を表示する
image.show()
```
このコードは、image.jpgという名前の画像ファイルを読み込み、Imageモジュールを使用して画像を表示します。

## ファイル操作に関する注意点
- ファイル操作を行う前に、ファイルへのアクセス権を持っていることを確認する必要がある
- ファイルを書き込む場合は、ファイルが存在しない場合は新規に作成し、存在する場合は上書きするかどうかを事前に確認する必要がある
- ファイルを削除する場合は、誤って必要なファイルを削除しないよう注意する必要がある