Python初心者向け講座

# Pythonを学べ

なにせ簡単だからな。
この記事はPythonの基本構造と基礎を理解するための記事です。
特大ボリュームで作ってます。

## 概要

この記事のざっくり紹介

### 目的

- Pythonの初歩を学んでスキルアップを目指す。
- Pythonを使ってプログラミングに必要な思考を養う。

### コース内容

- [1 Pythonとは](#1-pythonとは)
- [2 環境構築](#2-環境構築)
  - [2.1 Pythonのインストール](#21-pythonのインストール)
  - [2.2 エディタのインストール](#22-エディタのインストール)
  - [2.3 Visual Studio Codeの設定](#23-visual-studio-codeの設定)
  - [2.4 Pythonファイルの作成](#24-pythonファイルの作成)
- [3 プログラムの基本構造](#3-プログラムの基本構造)
  - [3.1 順次処理](#31-順次処理)
  - [3.2 変数](#32-変数)
  - [3.3 データ型](#33-データ型)
    - [3.3.1 数値](#331-数値)
    - [3.3.2 文字列](#332-文字列)
    - [3.3.3 ブール値](#333-ブール値)
    - [3.3.4 リスト](#334-リスト)
    - [3.3.5 タプル](#335-タプル)
    - [3.3.6 辞書](#336-辞書)
    - [3.3.7 集合](#337-集合)
  - [3.4 演算子](#34-演算子)
    - [3.4.1 算術演算子](#341-算術演算子)
    - [3.4.2 比較演算子](#342-比較演算子)
    - [3.4.3 論理演算子](#343-論理演算子)
    - [3.4.4 代入演算子](#344-代入演算子)
  - [3.5 条件分岐](#35-条件分岐)
    - [3.5.1 if文](#351-if文)
    - [3.5.2 else文](#352-else文)
    - [3.5.3 elif文](#353-elif文)
    - [3.5.4 case文](#354-case文)
- [4 関数](#4-関数)
  - [4.1 関数の定義](#41-関数の定義)
  - [4.2 関数の呼び出し](#42-関数の呼び出し)
  - [4.3 引数](#43-引数)
  - [4.4 戻り値](#44-戻り値)
  - [4.5 ラムダ式](#45-ラムダ式)
- [5 クラス](#5-クラス)
- [6 例外処理](#6-例外処理)
- [7 モジュール](#7-モジュール)
- [8 パッケージ](#8-パッケージ)
- [9 ファイル操作](#9-ファイル操作)
- [10 実践](#10-実践)
  - [10.1 簡単な計算](#101-簡単な計算)
  - [10.2 じゃんけん](#102-じゃんけん)
  - [10.3 ファイル操作](#103-ファイル操作)

## 1. Pythonとは

> Pythonは1991年にグイド・ヴァン・ロッサムにより開発されたプログラミング言語である。
最初にリリースされたPythonの設計哲学は、ホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。

最近だとAIで活用されていたりする初心者向け言語です。

## 2. 環境構築

### 2.1 Pythonのインストール

Pythonのインストールは[公式サイト](https://www.python.org/)からダウンロードできます。
Pythonは2.x系と3.x系がありますが、今回は3.x系を使います。

### 2.2 エディタのインストール

Pythonのコードを書くためにはエディタが必要です。
エディタはいくつかありますが、今回は[Visual Studio Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)を使います。

### 2.3 Visual Studio Codeの設定

Visual Studio Codeを起動して、拡張機能をインストールします。
`CTRL + Shift + X`で拡張機能の画面が開きます。
拡張機能は検索バーから以下のものをインストールしてください。

- Python
- Python for VSCode

### 2.4. Pythonファイルの作成

Visual Studio CodeでPythonのファイルを作成します。
`CTRL + N`で新規ファイルを作成し、`main.py`という名前で保存します。

## 3. プログラムの基本構造

### 3.1. 順次処理

Pythonのプログラムは上から順に実行されます。
`greeting.py`を作成し、以下のコードを実行してみましょう。

```python
print("Good Morning")
print("Good Afternoon")
print("Good Evening")
```

### 3.2. 変数

変数は値を格納するための箱のようなものです。

:::note info
Pythonは参照型のため、正確には「値(オブジェクト)に名前や名札をつける」といった表現のほうが正しいです。
:::
`variable.py`を作成し、以下のコードを実行してみましょう。

```python
name = "Taro"
print(name)
```

以下のように出力されます。

```bash
$ python variable.py
Taro
```

`=`はミリデタ(区切り文字)と呼ばれ、右辺の値を左辺の変数に代入する特殊な記号です。
`name = "Taro"`では、`"Taro"`という文字列を`name`と名付けています。

### 3.3. データ型

データ型は値の種類を表します。
Pythonには以下のようなデータ型があります。

- 数値
  - 整数 (int)
  - 浮動小数点数 (float)
  - 複素数 (complex)
- 文字列 (str)
- ブール値 (bool)
- リスト (list)
- タプル (tuple)
- 辞書 (dict)
- 集合 (set)

Pythonは動的型付け言語なので、変数に代入された値によってデータ型が決まります。
値(オブジェクト)の型を調べるには`type()`関数を使います。

#### 3.3.1. 数値

数値は整数と浮動小数点数の2種類があります。
`number.py`を作成し、以下のコードを実行してみましょう。

```python
# 整数
num1 = 1
print(num1)
ptint(type(num1))

# 浮動小数点数
num2 = 1.0
print(num2)
print(type(num2))
```

以下のように出力されます。

```bash
$ python number.py
1
<class 'int'>
1.0
<class 'float'>
```

#### 3.3.2. 文字列

文字列は`"`もしくは`'`で囲まれた文字のことです。
状況によっては三重クオートも使用します。
`string.py`を作成し、以下のコードを実行してみましょう。

```python
name = "Taro"
print(name)
print(type(name))
```

以下のように出力されます。

```bash
$ python string.py
Taro
<class 'str'>
```

#### 3.3.3. ブール値

ブール値は`True`もしくは`False`の2種類の値を持ちます。
`boolean.py`を作成し、以下のコードを実行してみましょう。

```python
flag = True
print(flag)
print(type(flag))
```

以下のように出力されます。

```bash
$ python boolean.py
True
<class 'bool'>
```

#### 3.3.4. リスト

リストは複数の値を格納することができます。
`list.py`を作成し、以下のコードを実行してみましょう。

```python
names = ["Taro", "Jiro", "Saburo"]
print(names)
print(type(names))
```

以下のように出力されます。

```bash
$ python list.py
['Taro', 'Jiro', 'Saburo']
<class 'list'>
```

#### 3.3.5. タプル

タプルは複数の値を格納することができます。
リストとの違いは、タプルは変更できないという点です。
`tuple.py`を作成し、以下のコードを実行してみましょう。

```python
names = ("Taro", "Jiro", "Saburo")
print(names)
print(type(names))
```

以下のように出力されます。

```bash
$ python tuple.py
('Taro', 'Jiro', 'Saburo')
<class 'tuple'>
```

リストとの違いを確認するために、以下のコードを実行してみましょう。

```python
names = ("Taro", "Jiro", "Saburo")
names[0] = "Shiro"
print(names)
```

以下のように出力されます。

```bash
$ python tuple.py
Traceback (most recent call last):
  File "tuple.py", line 2, in <module>
    names[0] = "Shiro"
TypeError: 'tuple' object does not support item assignment
```

これはタプルは変更できないというエラーです。
ではリストではどうなるか確認してみましょう。

```python
names = ["Taro", "Jiro", "Saburo"]
names[0] = "Shiro"
print(names)
```

以下のように出力されます。

```bash
$ python list.py
['Shiro', 'Jiro', 'Saburo']
```

リストは変更できることがわかります。

リストやタプルは任意の場所に格納された値のみを取り出すことができます。
`list.py`を作成し、以下のコードを実行してみましょう。

```python
names = ["Taro", "Jiro", "Saburo"]
print(names[0])
print(names[1])
print(names[2])
```

以下のように出力されます。

```bash
$ python list.py
Taro
Jiro
Saburo
```

番号を指定して値を取り出すことをインデックスと呼びます。
インデックスは0から始まることに注意してください。

リストやタプルは`len()`関数で要素数を取得することができます。

```python
names = ["Taro", "Jiro", "Saburo"]
print(len(names))
```

以下のように出力されます。

```bash
$ python list.py
3
```

リストとタプルの中にリストやタプルを入れることもできます。
これは多次元配列と呼ばれます。
`multi_dimensional_array.py`を作成し、以下のコードを実行してみましょう。

```python
names = [["Taro", "Jiro", "Saburo"], ["Shiro", "Goro", "Rokuro"]]
print(names)
print(type(names))
```

以下のように出力されます。

```bash
$ python multi_dimensional_array.py
[['Taro', 'Jiro', 'Saburo'], ['Shiro', 'Goro', 'Rokuro']]
<class 'list'>
```

多次元配列でもインデックスを使って値を取り出すことができます。
`multi_dimensional_array_index.py`を作成し、以下のコードを実行してみましょう。

```python
names = [["Taro", "Jiro", "Saburo"], ["Shiro", "Goro", "Rokuro"]]
print(names[0][0])
print(names[0][1])
print(names[0][2])
print(names[1][0])
print(names[1][1])
print(names[1][2])
```

以下のように出力されます。

```bash
$ python multi_dimensional_array_index.py
Taro
Jiro
Saburo
Shiro
Goro
Rokuro
```

また、インデックスは頭からではなく後ろからでも取得が可能です。
その際は`-x`を使用します。

`reverse_index.py`を作成し、以下のコードを実行してみましょう。

```python
names = ["Taro", "Jiro", "Saburo"]
print(names[-1])
print(names[-2])
print(names[-3])
```

以下のように出力されます。

```bash
$ python reverse_index.py
Saburo
Jiro
Taro
```

#### 3.3.6. 辞書

辞書はキーと値のペアを格納することができます。

#### 3.3.7. 集合

集合は重複しない値を格納することができます。

### 3.4. 演算子

演算子は値を計算するための記号です。
Pythonには以下のような演算子があります。

- 算術演算子
  - `+` 加算
  - `-` 減算
  - `*` 乗算
  - `/` 除算
  - `//` 切り捨て除算
  - `%` 剰余
  - `**` べき乗
- 比較演算子
  - `==` 等しい
  - `!=` 等しくない
  - `>` より大きい
  - `<` より小さい
  - `>=` 以上
  - `<=` 以下
- 論理演算子
  - `and` かつ
  - `or` または
  - `not` でない
- 代入演算子
  - `=` 代入
  - `+=` 加算代入
  - `-=` 減算代入
  - `*=` 乗算代入
  - `/=` 除算代入
  - `//=` 切り捨て除算代入
  - `%=` 剰余代入
  - `**=` べき乗代入

#### 3.4.1. 算術演算子

算術演算子は数値を計算するための演算子です。
`arithmetic.py`を作成し、以下のコードを実行してみましょう。

```python
num1 = 1
num2 = 2
print(num1 + num2)
print(num1 - num2)
print(num1 * num2)
print(num1 / num2)
print(num1 // num2)
print(num1 % num2)
print(num1 ** num2)
```

以下のように出力されます。

```bash
$ python arithmetic.py
3
-1
2
0.5
0
1
1
```

#### 3.4.2. 比較演算子

比較演算子は値を比較するための演算子です。
比較演算子は真偽値を返します。
`comparison.py`を作成し、以下のコードを実行してみましょう。

```python
num1 = 1
num2 = 2
print(num1 == num2)
print(num1 != num2)
print(num1 > num2)
print(num1 < num2)
print(num1 >= num2)
print(num1 <= num2)
```

以下のように出力されます。

```bash
$ python comparison.py
False
True
False
True
False
True
```

#### 3.4.3. 論理演算子

論理演算子は真偽値を計算するための演算子です。
論理演算子は真偽値を返します。
`logical.py`を作成し、以下のコードを実行してみましょう。

```python
flag1 = True
flag2 = False
print(flag1 and flag2)
print(flag1 or flag2)
print(not flag1)
```

以下のように出力されます。

```bash
$ python logical.py
False
True
False
```

#### 3.4.4. 代入演算子

代入演算子は値を代入するための演算子です。
計算した結果を代入したい場合に使います。
`assignment.py`を作成し、以下のコードを実行してみましょう。

```python
num = 1
num += 10
print(num)
num -= 1
print(num)
num *= 2
print(num)
num /= 2
print(num)
num //= 2
print(num)
num %= 2
print(num)
num **= 2
print(num)
```

以下のように出力されます。

```bash
$ python assignment.py
11
10
20
10.0
5.0
1.0
1.0
```

### 3.5. 条件分岐

#### 3.5.1. if文

条件分岐は条件によって処理を分岐するための構文です。
`if.py`を作成し、以下のコードを実行してみましょう。

```python
num = 1
if num == 1:
    print("num is 1")
```

以下のように出力されます。

```bash
$ python if.py
num is 1
```

`if`の後に条件を書き、`:`をつけます。
次の行からはインデントを揃えて処理を書きます。
インデントはスペース4つまたは2つで揃えます。
インデントを揃えないとエラーになるので注意してください。

#### 3.5.2. else文

`if`の後に`else`を書くと、条件が`False`の場合に実行される処理を書くことができます。
`if_else.py`を作成し、以下のコードを実行してみましょう。

```python
num = 1
if num == 2:
    print("num is 1")
else:
    print("num is not 1")
```

以下のように出力されます。

```bash
$ python if_else.py
num is not 1
```

numの値を変えると出力が変わります。

#### 3.5.3. elif文

`if`の後に`elif`を書くと、条件が`False`の場合にさらに条件を書くことができます。
`if_elif.py`を作成し、以下のコードを実行してみましょう。

```python
num = 1
if num == 2:
    print("num is 2")
elif num == 1:
    print("num is 1")
else:
    print("num is not 1")
```

以下のように出力されます。

```bash
$ python if_elif.py
num is 1
```

これもnumの値を変えると出力が変わります。
`elif`は複数書くことができます。
`if_elif_elif.py`を作成し、以下のコードを実行してみましょう。

```python
num = 1
if num == 2:
    print("num is 2")
elif num == 1:
    print("num is 1")
elif num == 0:
    print("num is 0")
else:
    print("num is not 1")
```

以下のように出力されます。

```bash
$ python if_elif_elif.py
num is 1
```

#### 3.5.4. case文

`case`を使用して条件分岐を書くこともできます。
`case.py`を作成し、以下のコードを実行してみましょう。

```python
x = 1
match num:
      case int(x) if sample > 0:
        print("sample is integer and greater than 0")
    case str(x) if sample == "hello":
        print("sample is string and 'hello'")
    case int(x):
        print("sample is integer")
    case str(x):
        print("sample is string")
    case _:
        print("other!")
```

以下のように出力されます。

```bash
$ case.py
sample is integer
```

## 4. 関数

関数は処理をまとめて名前をつけたものです。
関数を使うことで、同じ処理を何度も書く必要がなくなります。
`function.py`を作成し、以下のコードを実行してみましょう。

```python
def hello():
    print("Hello")

hello()
```

以下のように出力されます。

```bash
$ python function.py
Hello
```

### 4.1. 関数の定義

関数を定義するには`def`を使います。

```python
def 関数名():
    処理
```

### 4.2. 関数の呼び出し

関数を呼び出すには関数名の後に`()`をつけます。

```python
関数名()
```

### 4.3. 引数

関数には引数を渡すことができます。
引数は関数の中で使う変数のようなものです。
`argument.py`を作成し、以下のコードを実行してみましょう。

```python
def hello(name):
    print("Hello " + name)

hello("Taro")
```

以下のように出力されます。

```bash
$ python argument.py
Hello Taro
```

引数は複数渡すこともできます。
`argument.py`を作成し、以下のコードを実行してみましょう。

```python
def hello(name1, name2):
    print("Hello " + name1 + " and " + name2)

hello("Taro", "Jiro")
```

以下のように出力されます。

```bash
$ python argument.py
Hello Taro and Jiro
```

### 4.4. 戻り値

関数は戻り値を返すことができます。
戻り値は関数の呼び出し元に返される値です。
`return.py`を作成し、以下のコードを実行してみましょう。

```python
def hello(name):
    return "Hello " + name

print(hello("Taro"))
```

以下のように出力されます。

```bash
$ python return.py
Hello Taro
```

### 4.5. ラムダ式

ラムダ式は無名関数のことです。
`lambda.py`を作成し、以下のコードを実行してみましょう。

```python
hello = lambda name: print("Hello " + name)
hello("Taro")
```

以下のように出力されます。

```bash
$ python lambda.py
Hello Taro
```

ラムダ式は簡易的に関数を定義するために使われます。
推奨される状況は多くはありませんが、関数の引数に関数を渡すときに使われることがあります。

## 5. クラス

クラスはオブジェクト指向プログラミングの概念です。
クラスを使うことで、同じ構造のオブジェクトを作成することができます。
`class.py`を作成し、以下のコードを実行してみましょう。

```python
class Person:
    def __init__(self, name):
        self.name = name

    def hello(self):
        print("Hello " + self.name)

person = Person("Taro")
person.hello()
```

以下のように出力されます。

```bash
$ python class.py
Hello Taro
```

クラスは関数をたくさん定義する際の整理などによく使われます。

## 6. 例外処理

例外処理はエラーが発生したときに処理を実行するための構文です。
`exception.py`を作成し、以下のコードを実行してみましょう。

```python
try:
    num = 1 / 0
except ZeroDivisionError:
    print("ZeroDivisionError")
```

以下のように出力されます。

```bash
$ python exception.py
ZeroDivisionError
```

`try`の中でエラーが発生すると、`except`の中の処理が実行されます。
`except`の後にエラーの種類を書きます。
エラーの種類は複数書くことができます。
`exception.py`を作成し、以下のコードを実行してみましょう。

```python
try:
    num = 1 / a
except ZeroDivisionError:
    print("ZeroDivisionError")
except TypeError:
    print("TypeError")
```

以下のように出力されます。

```bash
$ python exception.py
TypeError
```

`except`の後にエラーの種類を書かない場合は、全てのエラーに対応します。

```python
try:
    num = 1 / a
except:
    print("Error")
```

以下のように出力されます。

```bash
$ python exception.py
Error
```

## 7. モジュール

モジュールはPythonの標準機能を拡張するための機能です。
モジュールを使うことで、標準機能にない機能を使うことができます。
`module.py`を作成し、以下のコードを実行してみましょう。

```python
import math

print(math.pi)
```

以下のように出力されます。

```bash
$ python module.py
3.141592653589793
```

`import`を使ってモジュールを読み込みます。
`math`モジュールは数学関数を提供しています。
`math.pi`は円周率を表します。

モジュールを読み込むときに`as`を使うと、モジュール名を変更することができます。

```python
import math as m

print(m.pi)
```

モジュールの一部のみを読み込むこともできます。

```python
from math import pi

print(pi)
```

モジュールの一部のみを読み込むときに`as`を使うと、モジュール名を変更することができます。

```python
from math import pi as p

print(p)
```

## 8. パッケージ

パッケージはモジュールをまとめたものです。
パッケージを使うことで、モジュールを階層的に管理することができます。

```python
import package1.package2.module

package1.package2.module.hello()
```

## 9. ファイル操作

ファイル操作はファイルを読み書きするための機能です。
`file.py`を作成し、以下のコードを実行してみましょう。

```python
file = open("file.txt", "w")
file.write("Hello")
file.close()
```

`open()`関数でファイルを開きます。
`open()`関数の第一引数にファイル名を、第二引数にモードを指定します。
モードは以下のように指定します。

- `r` 読み込み
- `w` 書き込み
- `a` 追記
- `r+` 読み書き

`write()`関数でファイルに書き込みます。
`close()`関数でファイルを閉じます。

`file.txt`を作成し、以下のコードを実行してみましょう。

```python
file = open("file.txt", "r")
print(file.read())
file.close()
```

`read()`関数でファイルを読み込みます。

```bash
$ python file.py
Hello
```

with文を使うと、`close()`関数を書かなくてもファイルを閉じることができます。

```python
with open("file.txt", "r") as file:
    print(file.read())
```

With文を使うことで閉じ忘れによるエラーを防ぐことができます。

## 10. 実践

以下に練習用の課題を用意しました。
課題を解いてみましょう。

### 10.1. 簡単な計算

あなたの生年月日を四則計算してみましょう。
以下のようなコードを作成してください。

- `calculation.py`というファイルを作成する
- `calculation.py`を実行すると、あなたの生年月日を四則計算した結果が出力される
- 四則計算は以下のようなものを行う。
  ‐ 年 足す   月
  ‐ 月 引く   日
  ‐ 年 掛ける 日
  ‐ 年 割る   日

少し高度にやってみたい人は...

- `input()`関数を使うと、ユーザーからの入力を受け取ることができる

```python
name = input("名前を入力してください: ")
print(name)
```

<details><summary>ヒント</summary>

この記事の内容を参考にしてみましょう。

</details>

<details><summary>答え</summary>

```python
year = 2006
month = 6
day = 14

print(year + month)
print(month - day)
print(year * day)
print(year / day)
```

高度にやってみたい人は...

```python
year = int(input("年を入力してください: "))
month = int(input("月を入力してください: "))
day = int(input("日を入力してください: "))

print(year + month)
print(month - day)
print(year * day)
print(year / day)
```

</details>

### 10.2. じゃんけん

じゃんけんを作ってみましょう。
以下のようなコードを作成してください。

- `janken.py`というファイルを作成する
- `janken.py`を実行すると、じゃんけんができる
- じゃんけんは以下のようなものを行う。
  ‐ ユーザーが手を入力する
  ‐ コンピューターが手をランダムに決める
  ‐ 勝敗を判定する
  ‐ 勝敗を出力する

`random`モジュールを使うと、ランダムな値を取得することができる

```python
import random

print(random.randint(0, 2))
```

このコードでは、0から2のランダムな値を取得できます。

<details><summary>ヒント</summary>

この記事の内容を参考にしてみましょう。
勝利条件を判定するときは、どの構文を使えばいいでしょうか？

</details>

<details><summary>答え</summary>

```python
import random

user = int(input("0: グー, 1: チョキ, 2: パー: "))
computer = random.randint(0, 2)

if user == computer:
    print("あいこ")
elif user == 0 and computer == 1:
    print("勝ち")
elif user == 1 and computer == 2:
    print("勝ち")
elif user == 2 and computer == 0:
    print("勝ち")
else:
    print("負け")
```

すべてのパターンを書くのは大変かつ冗長になってしまうので条件を精査して単純化してみましょう。

</details>

### 10.3. ファイル操作

ファイル操作をしてみましょう。
以下のようなコードを作成してください。

- `file.py`というファイルを作成する
- `file.py`を実行すると、`file.txt`というファイルが作成される
- `file.txt`には以下のような内容が書き込まれる
  ‐ あなたの名前
  ‐ あなたの年齢
  ‐ あなたの身長
  ‐ あなたの体重

<details><summary>ヒント</summary>

この記事の内容を参考にしてみましょう。
ファイルを操作するときは、どの構文を使えばいいでしょうか？

</details>

<details><summary>答え</summary>

```python
name = "Taro"
age = 15
height = 170.0
weight = 60.0

file = open("file.txt", "w")
file.write(name + "\n")
file.write(str(age) + "\n")
file.write(str(height) + "\n")
file.write(str(weight) + "\n")
file.close()
```

inputを使用すると、ユーザーからの入力を受け取ることができます。

```python
name = input("名前を入力してください: ")
age = int(input("年齢を入力してください: "))
height = float(input("身長を入力してください: "))
weight = float(input("体重を入力してください: "))

file = open("file.txt", "w")
file.write(name + "\n")
file.write(str(age) + "\n")
file.write(str(height) + "\n")
file.write(str(weight) + "\n")
file.close()
```

</details>