Pythonプログラミング基礎編
上から下へ、全 122 枚そのまま並べています。
発表モードで開くPython基礎
Pythonプログラミング基礎編
ゼロからはじめるプログラミング
目次(前半)
全体の流れ
1. イントロダクション
2. Pythonプログラミングの基本
3. 変数と演算
4. 標準入出力
5. 制御構造(条件分岐)
6. 制御構造(ループ)
目次(後半)
全体の流れ
7. イテラブル
8. 関数とモジュール
9. クラスとオブジェクト
10. 例外処理
11. ライブラリの利用
Python基礎 - イントロダクション
イントロダクション
プログラミングとPythonの世界へようこそ
プログラミングとは
コンピュータに仕事をさせるには「プログラム」が必要です。
コンピュータにやってほしいことを、順番に書いた指示書(プログラム)を作ること。
・プログラムは料理のレシピに似ている
・専用の言語(プログラミング言語)で記述する
・記述されたプログラムを「コード」と呼ぶ
・コードを書くことを「コーディング」と呼ぶ
ゴールまでの3ステップ
プログラミングを身につけるまでの道のりを確認しましょう。
プログラミング上達のコツ
プログラミング力を高めるための心構えです。
- たくさん書いて、たくさん実行する
- 最初は時間がかかってもOK
- 思った通りに動くと楽しい
- 面白いからやってみる精神
- 疑問をうやむやにしない
- 質問の形にしてみることが大事
- 教えると理解が深まる
- わかっていることが明確になる
Pythonとは
数あるプログラミング言語の中で、なぜPythonなのか?
1991年にオランダのグイド・バァンロッサムが開発した、読みやすさを重視したプログラミング言語。
・書き方がシンプルで一貫している
・インタプリタ方式ですぐに試せる
・豊富なライブラリが存在する
・AI・Web・データ分析など多様な用途に対応
プログラミング言語の人気ランキング
Pythonは世界で最も人気のあるプログラミング言語です。
出典: TIOBE Index 2025年データをもとに作成(概算)
コンパイラとインタプリタ
プログラムを実行する2つの方式を比較します。
コンパイラ方式
- ソースコードを事前に機械語に翻訳
- 翻訳後のプログラムを実行する
- 実行速度が速い
- OS依存の実行ファイルが生成される
- 代表例:C言語、Java
インタプリタ方式
- ソースコードを逐次解釈しながら実行
- 翻訳と実行が一体的に行われる
- 書いたらすぐ試せる手軽さ
- 同じコードが異なるOSで動く
- 代表例:Python、PHP
Pythonの実行の仕組み(ハイブリッド方式)
実はPythonは「自動コンパイル+インタプリタ」のハイブリッド方式です。
プログラマーが書いたPythonのコードファイル
Pythonが自動的に中間形式にコンパイル。__pycache__フォルダに保存される
バイトコードを1命令ずつ解釈しながら実行。異なるOSでも同じバイトコードが動く
Pythonの開発環境
Pythonで開発する際によく使われるツールです。
- Python標準付属のIDE
- 軽量で手軽に試せる
- Microsoft社の無料エディタ
- 多言語対応で拡張性が高い
- JetBrains社のPython専用IDE
- 無料のCommunity版あり
- ブラウザで動く対話型環境
- データサイエンス分野で人気
クイズ
イントロダクションの理解を確認しましょう。
Pythonの特徴として正しくないものはどれですか?
クイズ 解答
Pythonの特徴として正しくないものはどれですか?
PythonはインタプリタのおかげでOSごとに書き直す必要はありません。同じコードがWindows・Mac・Linuxで動きます。
Python基礎 - プログラミングの基本
Pythonプログラミングの基本
はじめてのプログラムを書いて動かそう
プログラムが動くまでの流れ
Pythonプログラムは3つのステップで動きます。
はじめてのPythonプログラム
・print()関数で文字列を画面に出力します。引数に表示したい内容を指定します。
# hello.py
print('Hello, Python!')
print("ようこそ Pythonの世界へ")Pythonの特徴的なポイント
他の言語と比べたPythonの特徴です。
- 保存してすぐ実行できる
- 文末に ; を付けなくてよい
- 代入した値から自動で型を判断
- 字下げでブロック構造を表現
インデント(字下げ)が重要
・Pythonでは半角スペース4個の字下げが文法の一部です。揃っていないとエラーになります。
# 正しい例
if True:
print('OK')
print('条件は真です')
# 間違った例(エラー!)
if True:
print('OK')
print('条件は真です') # IndentationError2種類のエラー
プログラムで発生するエラーは大きく2つに分かれます。
構文エラー (SyntaxError)
文法上の誤り。実行前に検出
カッコの閉じ忘れ
実行時エラー (RuntimeError)
実行中に発生する問題
0で割り算 (ZeroDivisionError)
代表的なエラーの種類
よく遭遇するエラーを覚えておきましょう。
SyntaxError
文法が正しくない
カッコ・引用符の閉じ忘れ
NameError
存在しない変数を使用
print(data) ※未定義
TypeError
型が一致しない演算
"A" + 1
ZeroDivisionError
0で割り算をした
10 / 0
ValueError
不正な値を扱った
int("abc")
コメントの書き方
・# の後に書いた部分は実行されません。コードの意図を説明するメモとして使います。
# これはコメントです
print('Hello, Python!') # ここもコメント
# 複数行コメント
"""
このプログラムは
2つの数値を入力して
その合計を表示します
"""良いコメントの書き方
コメントは「なぜその処理をしているのか」を書くことが大切です。
内容
意図・目的を説明
コードの動作をそのまま説明
長さ
1-2行で要点をまとめる
長文で詳細を書きすぎる
タイミング
コード変更と同時に更新
変更しても放置
PEP 8 — Pythonのコードスタイルガイド
PEP 8は読みやすく一貫性のあるコードを書くための公式ルールです。
- インデント:半角スペース4個(タブ混在はNG)
- 1行の長さ:原則79文字以内
- 命名規則:変数・関数はsnake_case、クラスはPascalCase、定数はALL_CAPS
- Import:ファイル冒頭にまとめ、1行1モジュール
- 比較:Noneとの比較はis、空判定はif not items:
クイズ
Pythonの基本構造を確認しましょう。
Pythonプログラムで画面に文字を表示する際に使う関数はどれですか?
クイズ 解答
Pythonプログラムで画面に文字を表示する際に使う関数はどれですか?
print()はPythonの組み込み関数で、引数に渡した値を画面(標準出力)に表示します。
Python基礎 - 変数と演算
変数と演算
データに名前をつけて計算しよう
算術演算子一覧
Pythonで使える計算の記号(演算子)です。
+
加算
10 + 2
12
-
減算
100 - 99
1
*
乗算
3 * 4
12
/
除算
11 / 3
3.666...
//
切り捨て除算
11 // 3
3
%
剰余(余り)
11 % 3
2
**
べき乗
2 ** 8
256
変数とは
変数は「データに名前をつけた箱」のようなものです。
データを入れておく名前つきの領域。何度でも中身を入れ替えられる。
・ham = 10 → hamという箱に10を入れる
・= は「等しい」ではなく「代入」の意味
・代入すると前の値は上書きされる
・厳密にはPythonの代入は「名前と値の結びつけ」
変数の使い方
・変数を作って、計算して、表示する基本的な流れです。
# 変数に代入
ham = 10
egg = 2
# 上書きされる
ham = 3
print(ham) # 3
# 変数から変数に代入
fish = egg
print(fish) # 2
# 算術演算の結果を代入
price = 500
count = 3
total = price * count
print('合計:', total) # 合計: 1500変数名のルール
変数名には守るべきルールがあります。
累算代入演算子
変数に対する計算と代入を1つにまとめた演算子です。
+=
加算代入
a += 2
a = a + 2
-=
減算代入
a -= 2
a = a - 2
*=
乗算代入
a *= 2
a = a * 2
/=
除算代入
a /= 2
a = a / 2
//=
切り捨て除算代入
a //= 2
a = a // 2
%=
剰余代入
a %= 2
a = a % 2
データ型
Pythonの主なデータ型です。type()関数で型を調べられます。
int(整数)
小数点のない数字。桁数の制限なし
10, -5, 0
float(浮動小数点数)
小数点のある数字。約15桁の精度
3.14, 0.5
str(文字列)
引用符で囲んだ文字の並び
"Hello", 'Python'
bool(真偽値)
TrueかFalseの2択
True, False
リテラルの種類
コード中で値を直接表現したものをリテラルと呼びます。
- 10進数: 42, -100
- 2進数: 0b1010
- 16進数: 0xff
- 標準表記: 3.14
- 指数表記: 1.5e-3
- 'Hello' または "Hello"
- 三重クォート: """複数行"""
- True / False(真偽値)
- None(何もない値)
エスケープシーケンス
文字列内で特別な意味を持つ記号の表記法です。
\n
改行
print('Hello\nWorld')
\t
タブ
print('名前\t年齢')
\\
バックスラッシュ自体
print('C:\\Users')
\"
ダブルクォーテーション
print(\"He said \\\"Hi\\\"\")
\\
\(円記号/バックスラッシュ)
パスの区切り文字
型変換
・str(), int(), float()で型を変換できます。
# 数値 → 文字列
str(1200) # '1200'
# 文字列 → 整数
int('2017') # 2017
# 文字列 → 浮動小数点数
float('1.4444') # 1.4444
# 浮動小数点数 → 整数(小数部切り捨て)
int(3.14) # 3クイズ
変数と演算の理解を確認しましょう。
a = 10 のあとに a = a + 3 を実行しました。変数aの値はいくつですか?
クイズ 解答
a = 10 のあとに a = a + 3 を実行しました。変数aの値はいくつですか?
a = a + 3 は右辺のa(10)に3を足した13を左辺のaに代入します。
Python基礎 - 標準入出力
標準入出力
print関数とinput関数を使いこなそう
入力→演算→出力の基本構造
コンピュータの仕事はすべて「入力→演算→出力」で表されます。
キーボード(標準入力)
ファイル読み込み
計算・比較・判断
データの加工
画面表示(標準出力)
ファイル書き込み
print関数の使い方
・print()は画面に文字や数値を出力する組み込み関数です。
# 基本の出力
print('Hello, Python!')
print(100)
print(10 + 5)
# 複数の値を出力(sepで区切り文字を指定)
print('名前:', '太郎', sep='→') # 名前:→太郎
# 改行なしで出力(endを指定)
print('Hello', end='')
print('world') # Helloworldf文字列(フォーマット文字列)
・f文字列を使うと、変数の値を文字列に埋め込めます。Python3.6以降で推奨。
name = 'Taro'
age = 20
print(f'{name}さんは{age}歳です')
# 計算式も直接書ける
print(f'合計は{10 + 3}です')
# 小数点の桁数指定
pi = 3.14159
print(f'円周率は{pi:.2f}です') # 3.14
# ゼロ埋め・桁区切り
print(f'{42:05d}') # 00042
print(f'{1234567:,}') # 1,234,567input関数の使い方
・input()はキーボードからデータを入力する関数です。入力値は常に文字列になります。
# 文字列として入力を受け取る
line = input('=>')
# 数値として使う場合は型変換が必要
print('足し算するよ')
op1 = input('=>')
op2 = input('=>')
answer = int(op1) + int(op2)
print('答え', answer)ファイル入出力(open関数)
・open()でファイルの読み書きができます。withブロックでファイルを安全に扱います。
# ファイルに書き込む
with open('hello.txt', 'w', encoding='utf-8') as f:
f.write('こんにちは\n')
f.write('Python\n')
# ファイルを読み込む
with open('hello.txt', 'r', encoding='utf-8') as f:
text = f.read()
print(text)
# モード: 'r'=読込, 'w'=上書き, 'a'=追記クイズ
標準入出力の理解を確認しましょう。
input()で受け取った値のデータ型はどれですか?
クイズ 解答
input()で受け取った値のデータ型はどれですか?
input()で入力されたデータは常に文字列(str)として扱われます。数値として計算するにはint()やfloat()で変換が必要です。
Python基礎 - 条件分岐
制御構造(条件分岐)
条件に応じて処理を変えよう
比較演算子
条件式を作るための演算子です。結果はTrue/Falseになります。
==
等しい
age == 20
!=
等しくない
age != 20
<
より小さい
age < 20
>
より大きい
age > 20
<=
以下
age <= 20
>=
以上
age >= 20
真偽値の判定ルール
bool型以外でも真偽が判定されます。
int / float
0以外
0
str
空文字列以外
''(空文字列)
list / dict
要素あり
[]や{}(空)
None
−
常に偽
if文の基本
・if文で条件に応じた処理を書きます。else節で偽のときの処理も指定できます。
age = int(input('年齢=>'))
if age >= 20:
print('お酒を販売する')
else:
print('お酒を販売しない')elif節で複数条件を分岐
・elif節を使うと、条件を順番に評価して該当する処理だけを実行できます。
score = int(input('点数を入力: '))
if score >= 80:
print('優')
elif score >= 60:
print('良')
elif score >= 40:
print('可')
else:
print('不可')if文のネスト(入れ子)
・if文の中にさらにif文を書くことができます。インデントを深くして表現します。
print('ホットにしますか?(y/n)')
is_hot = input('=>')
print('ミルクをいれますか?(y/n)')
is_milk = input('=>')
if is_hot == 'y':
if is_milk == 'y':
print('ホットカフェオレ')
else:
print('ホットコーヒー')
else:
if is_milk == 'y':
print('アイスカフェオレ')
else:
print('アイスコーヒー')論理演算子
複数の条件を組み合わせるための演算子です。
- 両方が真のときだけ真
- a > 0 and b > 0
- どちらか一方が真なら真
- a > 0 or b > 0
- 真偽を反転させる
- not a > 20
短絡評価(ショートサーキット)
論理演算では、結果が決まった時点で残りの条件式を評価しない仕組みがあります。
- andの場合:左が偽なら右は評価しない(結果は偽で確定)
- orの場合:左が真なら右は評価しない(結果は真で確定)
- a = 0 のとき a != 0 and b / a > 1 → 右辺は評価されずエラー回避
- andはorより結合の優先順位が高い
- カッコで明示すると安全:if a and (b or c):
クイズ
条件分岐の理解を確認しましょう。
次の条件式のうち、真(True)になるものはどれですか?
クイズ 解答
次の条件式のうち、真(True)になるものはどれですか?
10 >= 10 は「10は10以上か?」なので真(True)です。0はPythonでは偽として扱われます。
Python基礎 - ループ
制御構造(ループ)
繰り返し処理をマスターしよう
while文とfor文の使い分け
Pythonには2種類のループ構文があります。
while文
- 条件が真の間、繰り返す
- 回数が決まっていないときに使う
- カウンタ変数を自分で管理
- 無限ループも作れる
for文
- イテラブルから要素を順に取り出す
- 回数が決まっているときに使う
- range()で回数を指定
- リストや辞書の走査にも使う
while文の基本
・条件が真の間、処理を繰り返します。カウンタ変数で回数を管理します。
counter = 0
while counter < 5:
print('counter:', counter)
counter += 1
# counter: 0, 1, 2, 3, 4 と表示されるfor文とrange関数
・for文はrange()と組み合わせて、指定回数の繰り返しを簡単に書けます。
# 5回繰り返す(0, 1, 2, 3, 4)
for i in range(5):
print(i)
# 1から5まで
for i in range(1, 6):
print(i)
# 2ずつ増加
for i in range(0, 10, 2):
print(i) # 0, 2, 4, 6, 8for文のネスト(九九の表)
・for文の中にfor文を書くことで二重ループが作れます。九九の表を例に見てみましょう。
for x in range(1, 10):
for y in range(1, 10):
print(f'{x*y:3}', end='')
print() # 行末で改行
# 出力:
# 1 2 3 ... 9
# 2 4 6 ... 18
# ...continueとbreak
・ループの制御に使う2つの文を比較します。
continue(スキップ)
- その周の残り処理をスキップ
- ループの先頭に戻る
- ループ自体は継続する
- 特定条件だけ飛ばしたいときに使う
break(終了)
- ループそのものを途中で終了
- ループの後ろの処理へ進む
- ループ全体を抜ける
- 特定条件で止めたいときに使う
無限ループと対話型アプリ
・while Trueで無限ループを作り、breakで終了条件を設定します。
print('得点を入力(endで終了)')
total = 0
count = 0
while True:
value = input('score > ')
if value == 'end':
break
score = int(value)
total += score
count += 1
if count > 0:
print(f'平均: {total / count:.1f}')
else:
print('入力なし')クイズ
ループの理解を確認しましょう。
for i in range(5): で変数iに入る値はどれですか?
クイズ 解答
for i in range(5): で変数iに入る値はどれですか?
range(5)は0から始まり、5は含まれません。したがって 0, 1, 2, 3, 4 の5つの値が順に入ります。
Python基礎 - イテラブル
イテラブル
リスト・タプル・辞書・集合を使いこなそう
イテラブルの種類
for文で順に要素を取り出せるデータ構造をイテラブルと呼びます。
リスト (list)
可能
可能
あり
タプル (tuple)
不可
可能
あり
辞書 (dict)
可能
キー不可
挿入順
集合 (set)
可能
不可
なし
文字列 (str)
不可
あり
あり
リストの基本操作
・リストは最も基本的な配列構造です。[]で作成し、インデックスでアクセスします。
# リストの作成
fruits = ['apple', 'banana', 'cherry']
# インデックスでアクセス(0始まり)
print(fruits[0]) # apple
print(fruits[-1]) # cherry
# 要素の追加・削除
fruits.append('grape')
fruits.remove('banana')
# 要素数・検索
print(len(fruits)) # 3
print('apple' in fruits) # Trueスライス(リストの一部を取り出す)
・リスト[開始:終了]で部分リストを取り出せます。終了のインデックスは含まれません。
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(nums[2:5]) # [3, 4, 5]
print(nums[:3]) # [1, 2, 3](先頭から)
print(nums[7:]) # [8, 9, 10](末尾まで)
print(nums[::2]) # [1, 3, 5, 7, 9](2個おき)タプルの基本
・タプルはリストに似ていますが、作成後に変更できない(イミュータブル)のが特徴です。
# タプルの作成(丸かっこ)
product = ('apple', 150, True)
print(product[0]) # apple
# 1要素のタプルはカンマ必須
t1 = ('apple',)
# パッキング(カッコなしでもOK)
info = 'Taro', 20, 'Tokyo'
# アンパッキング(複数変数に展開)
name, age, city = info
print(name) # Taro
# 不要な値は _ で捨てる
first, *middle, last = (1, 2, 3, 4, 5)
print(middle) # [2, 3, 4]辞書の基本操作
・辞書はキーと値のペアでデータを管理します。{}で作成し、キーでアクセスします。
product = {
'name': 'Notebook PC',
'price': 120000,
'stock': 5
}
print(product['name']) # Notebook PC
# 安全な参照(get)
print(product.get('cpu', 'なし')) # なし
# 追加・更新・削除
product['cpu'] = 'Core i5'
product['stock'] = 3
del product['price']集合(セット)
・集合は重複のない要素の集まりです。数学の集合演算が簡単にできます。
# 集合の作成
fruits = {'apple', 'banana', 'orange'}
# リストから重複を除去
nums = [1, 2, 2, 3, 3, 3]
unique = set(nums) # {1, 2, 3}
# 集合演算
a = {'apple', 'banana', 'orange'}
b = {'banana', 'grape'}
print(a & b) # {'banana'}(共通部分)
print(a - b) # {'orange', 'apple'}(差分)
print(a | b) # 全要素(和集合)for文でイテラブルを操作
・for文を使うと、リストや辞書の要素をひとつずつ取り出して処理できます。
# リストの走査
numbers = [3, 6, 9, 15]
total = 0
for num in numbers:
total += num
print('合計:', total)
# 辞書の走査(items)
stocks = {'PC': 5, 'Mouse': 0}
for name, stock in stocks.items():
if stock == 0:
print(f'{name}は在庫切れ')enumerate と zip
・enumerateでインデックスと値を同時に、zipで複数リストを同時に処理できます。
# enumerate(番号つき)
fruits = ['apple', 'banana', 'orange']
for i, fruit in enumerate(fruits):
print(i, fruit) # 0 apple, 1 banana...
# zip(複数リストを同時に)
names = ['Taro', 'Hanako']
scores = [85, 92]
for name, score in zip(names, scores):
print(name, score)
# 組み合わせ
for i, (n, s) in enumerate(zip(names, scores), start=1):
print(i, n, s)リスト内包表記
・リストを簡潔に生成するPython独自の書き方です。
# 通常のfor文
result = []
for n in [1, 2, 3]:
result.append(n * 2)
# リスト内包表記(1行で書ける)
result = [n * 2 for n in [1, 2, 3]]
print(result) # [2, 4, 6]
# 条件付き(偶数だけ抽出)
even = [n for n in range(10) if n % 2 == 0]
print(even) # [0, 2, 4, 6, 8]文字列の操作
・文字列もイテラブルです。インデックスアクセスやreplaceが使えますが、変更はできません。
msg = 'Hello, world!'
print(msg[0]) # H
print(msg[-1]) # !
print(len(msg)) # 13
# 文字列はイミュータブル(変更不可)
# msg[0] = 'h' → TypeError
# 新しい文字列を作る
msg2 = msg.replace('Hello', 'Good-bye')
print(msg2) # Good-bye, world!
# 連結・繰り返し
print('Hi' + '!' * 3) # Hi!!!コマンドライン引数
・sys.argvでプログラム実行時に外部から値を受け取れます。
import sys
print(sys.argv)
# 実行例: python args.py 1 2 3
# 出力: ['args.py', '1', '2', '3']
# 引数はすべて文字列として受け取られる
# 数値として使うにはint()で変換が必要クイズ
イテラブルの理解を確認しましょう。
data = [10, 20, 30, 40] のとき print(data[1:3]) の結果はどれですか?
クイズ 解答
data = [10, 20, 30, 40] のとき print(data[1:3]) の結果はどれですか?
data[1:3]はインデックス1から3の手前まで、つまりdata[1]とdata[2]を取り出します。結果は[20, 30]です。
Python基礎 - 関数とモジュール
関数とモジュール
処理をまとめて再利用しよう
関数とは
関数はひとまとまりの処理に名前をつけ、何度でも呼び出せるようにしたものです。
引数を受け取り、処理を実行し、戻り値を返す再利用可能な処理のかたまり。
・defキーワードで定義する
・引数:関数に渡すデータ
・戻り値:関数の処理結果(return文で返す)
・戻り値を返さない関数も作れる
関数の定義と呼び出し
・def文で関数を定義し、関数名()で呼び出します。
# 関数定義
def add_numbers(num1, num2):
return num1 + num2
# 関数呼び出し
result = add_numbers(10, 20)
print('計算結果:', result) # 30
# デフォルト値つき引数
def greet(name, msg='こんにちは'):
print(f'{msg}、{name}さん')
greet('太郎') # こんにちは、太郎さん
greet('花子', 'おはよう') # おはよう、花子さん位置引数とキーワード引数
・引数の渡し方には「順番で渡す」方法と「名前を指定して渡す」方法があります。
def export(title, author, fmt):
print(f'{title} by {author} ({fmt})')
# 位置引数(順番で渡す)
export('レポート', '山田', 'PDF')
# キーワード引数(名前で渡す)
export(fmt='Excel', title='月報', author='佐藤')
# 混在も可能(位置引数が先)
export('年報', author='鈴木', fmt='CSV')可変長引数(*args, **kwargs)
・引数の数が決まっていない場合、*でタプル、**で辞書として受け取れます。
# *args: 任意数の位置引数をタプルで受け取る
def total(*nums):
return sum(nums)
print(total(1, 2, 3)) # 6
print(total(10, 20, 30, 40)) # 100
# **kwargs: 任意数のキーワード引数を辞書で受け取る
def profile(**info):
for key, val in info.items():
print(f'{key}: {val}')
profile(name='Taro', age=20, city='Tokyo')変数のスコープ
変数が使える範囲(スコープ)は「どこで作られたか」で決まります。
ローカル変数
- 関数の中で作成した変数
- その関数の中でのみ使える
- 関数ごとに独立して管理
- 関数を抜けると消える
グローバル変数
- 関数の外で作成した変数
- プログラム全体で利用可能
- global文で関数内から変更可能
- nonlocalは外側関数の変数を変更
モジュールの活用
よく使う機能をファイルにまとめたものがモジュールです。import文で読み込みます。
- import sys
- sys.argv で引数を取得
- from sys import argv
- モジュール名の修飾を省略
- 再利用しやすくなる
- チーム開発で分担しやすい
- 部分的な機能向上が容易
クイズ
関数の理解を確認しましょう。
次の関数定義の引数の数はいくつですか? def add(a, b): return a + b
クイズ 解答
次の関数定義の引数の数はいくつですか? def add(a, b): return a + b
def add(a, b) の引数はaとbの2つです。
Python基礎 - クラスとオブジェクト
クラスとオブジェクト
オブジェクト指向プログラミングの基礎
なぜオブジェクト指向が必要か
・ソフトウェアの大規模化に伴い、プログラムを整理する方法が求められました。
オブジェクト指向なし
- プログラム全体が1つの巨大なかたまり
- 変更すると影響範囲が広い
- チーム開発で分担しにくい
- 再利用が難しい
オブジェクト指向あり
- プログラムをオブジェクト単位に分割
- 変更の影響をオブジェクト内に閉じ込め
- チーム開発で分担しやすい
- 疎結合で再利用しやすい
クラスからインスタンスへ
クラスは「設計図」、インスタンスは「設計図から作られた実体」です。
class Personのように、属性(name, age)とメソッド(show_info)をまとめて定義する
person1 = Person('太郎', 20) のように、クラスから具体的なオブジェクトを作成する
person1.show_info() のように、インスタンスの処理を実行する
クラスの定義と使い方
・__init__メソッドでインスタンスの属性を初期化します。selfは「このインスタンス自身」を指します。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def show_info(self):
print(f'名前: {self.name} 年齢: {self.age}歳')
person1 = Person('大阪太郎', 20)
person2 = Person('東京花子', 25)
person1.show_info() # 名前: 大阪太郎 年齢: 20歳
person2.show_info() # 名前: 東京花子 年齢: 25歳カプセル化・継承・多態性
オブジェクト指向の3つの重要な概念です。
- データを外部から隠す
- _変数名で非公開を示す
- propertyで安全にアクセス
- 既存クラスの機能を引き継ぐ
- class Sub(Super): で定義
- super()で親の処理を呼び出す
- 同じメソッド名で異なる動作
- クラスの種類を意識せず呼べる
- ダックタイピングで柔軟
継承とオーバーライド
・サブクラスでスーパークラスのメソッドを上書き(オーバーライド)できます。
class Product:
def __init__(self, name, price):
self._name = name
self._price = price
def get_info(self):
return f'{self._name} 価格:{self._price}円'
class DiscountProduct(Product):
def __init__(self, name, price, discount):
super().__init__(name, price)
self._discount = discount
def get_info(self):
d = self._price - self._discount
return f'{self._name} 割引後:{d}円'
p = DiscountProduct('USB', 1500, 200)
print(p.get_info()) # USB 割引後:1300円プロパティ(@property)
・propertyを使うと、メソッドを属性のように自然に呼び出せます。値の検証も可能です。
class Product:
def __init__(self, name, price):
self._name = name
self._price = price
@property
def price(self):
return self._price
@price.setter
def price(self, value):
if value < 0:
raise ValueError('価格は0以上')
self._price = value
p = Product('USB', 1500)
print(p.price) # 1500(メソッドなのに属性風)
p.price = 2000 # setter経由で安全に変更特殊メソッド(ダンダーメソッド)
・__で囲まれた特殊メソッドを定義すると、組み込み関数や演算子と連携できます。
class Cart:
def __init__(self, items):
self._items = items
def __str__(self): # print()で呼ばれる
return f'Cart({self._items})'
def __len__(self): # len()で呼ばれる
return len(self._items)
def __repr__(self): # 対話モードで呼ばれる
return f'Cart(items={self._items})'
cart = Cart(['A', 'B', 'C'])
print(cart) # Cart(['A', 'B', 'C'])
print(len(cart)) # 3抽象クラスとダックタイピング
・ABCで「このメソッドを必ず実装してください」という約束を定義できます。
from abc import ABC, abstractmethod
class Printer(ABC):
@abstractmethod
def print_text(self, text):
pass
class ConsolePrinter(Printer):
def print_text(self, text):
print(f'出力: {text}')
# ダックタイピング(継承なしでも同じメソッドがあればOK)
class Logger:
def print_text(self, text):
print(f'LOG: {text}')
def show(obj):
obj.print_text('Hello')
show(ConsolePrinter()) # 出力: Hello
show(Logger()) # LOG: Helloクラスメソッドとスタティックメソッド
通常のインスタンスメソッド以外に2種類のメソッドがあります。
@classmethod
- 第1引数がcls(クラス自体)
- クラスから直接呼び出せる
- クラス変数の操作に使う
- インスタンス生成の補助にも
@staticmethod
- self/clsを受け取らない
- 通常の関数と同じ動作
- クラスに関連する補助処理
- バリデーションやフォーマットに
クイズ
クラスとオブジェクトの理解を確認しましょう。
カプセル化の目的として最も適切なものはどれですか?
クイズ 解答
カプセル化の目的として最も適切なものはどれですか?
カプセル化はデータを外部から隠し、メソッドを通してアクセスさせることで安全性と保守性を高める仕組みです。
Python基礎 - 例外処理
例外処理
エラーに強いプログラムを書こう
例外とは
例外は、実行中に発生する予期しない問題を安全に処理するための仕組みです。
文法的には正しいが、実行中に処理できない事態が発生したときに投げられるオブジェクト。
・エラーとは異なり、例外処理で復旧できる
・try/exceptで安全にキャッチする
・例外が発生すると通常の処理は中断される
・適切に処理すればプログラムを続行できる
try/exceptの基本
・try/exceptで例外をキャッチし、プログラムの異常終了を防ぎます。
try:
value = int(input('数字を入力: '))
result = 10 / value
print(result)
except ValueError:
print('数字として認識できません')
except ZeroDivisionError:
print('ゼロで割ることはできません')
print('END(ここは必ず実行)')else / finally / raise
・elseは例外なし時のみ、finallyは必ず実行。raiseで意図的に例外を発生させます。
# else と finally
try:
f = open('data.txt')
except FileNotFoundError:
print('ファイルが見つかりません')
else:
print('読み込み成功')
finally:
print('終了処理を実行')
# raise で意図的に例外を発生
def set_price(price):
if price < 0:
raise ValueError('価格は0以上')
print(f'設定: {price}円')例外オブジェクトと独自例外
・as eで例外の詳細を取得できます。Exceptionを継承して独自例外も作れます。
# 例外オブジェクトを受け取る
try:
10 / 0
except ZeroDivisionError as e:
print(f'例外: {e}') # division by zero
# 独自例外クラス
class InvalidAmountError(Exception):
pass
def pay(amount):
if amount < 0:
raise InvalidAmountError('金額は0以上')
print(f'{amount}円の支払い完了')
try:
pay(-500)
except InvalidAmountError as e:
print('エラー:', e)例外クラスの階層構造
Exception の下に中間クラスがあり、その下に実際に出るエラーが並びます。
クイズ
例外処理の理解を確認しましょう。
try/except文で、例外が発生しなかった場合にだけ実行されるブロックはどれですか?
クイズ 解答
try/except文で、例外が発生しなかった場合にだけ実行されるブロックはどれですか?
elseブロックは、tryの中で例外が発生しなかった場合にだけ実行されます。finallyは例外の有無に関係なく必ず実行されます。
Python基礎 - ライブラリ
ライブラリの利用
標準ライブラリと外部ライブラリを活用しよう
標準ライブラリと外部ライブラリ
Pythonのライブラリは2種類に分けられます。
標準ライブラリ
- Pythonに最初から含まれている
- 追加インストール不要
- datetime, os, json, csv, re など
- 基本的な処理をカバー
外部ライブラリ
- pipコマンドでインストール
- PyPIから取得する
- pandas, requests, Django など
- 専門的な処理に対応
datetime — 日付と時間
・日付・時間の取得、計算、フォーマット変換ができます。
from datetime import datetime, timedelta
now = datetime.now()
print(now.year, now.month, now.day)
# 1日後を計算
tomorrow = now + timedelta(days=1)
# 書式変換
print(now.strftime('%Y-%m-%d %H:%M:%S'))
print(now.strftime('%Y%m%d_%H%M%S')) # ファイル名用os / pathlib — ファイルとパス操作
・os.pathはパスを文字列で、pathlibはオブジェクトとして扱います。
import os
from pathlib import Path
# os.path(文字列ベース)
path = os.path.join('data', 'input', 'sample.txt')
print(os.path.exists(path))
# pathlib(オブジェクトベース・推奨)
p = Path('data') / 'input' / 'sample.txt'
print(p.exists())
print(p.name) # sample.txt
print(p.parent) # data/input
print(p.suffix) # .txtよく使う標準ライブラリ
実務で頻繁に使われる標準ライブラリの一覧です。
json
JSON形式の読み書き
json.dump() / json.load()
csv
CSVファイルの読み書き
csv.writer() / csv.reader()
re
正規表現パターンマッチ
re.search(pattern, text)
random
乱数・ランダム選択
random.randint(1, 6)
zipfile
ZIP圧縮・展開
ZipFile('backup.zip', 'w')
よく使う外部ライブラリ
pip installでインストールする外部ライブラリの代表例です。
pandas
データ分析
表形式データの集計・加工
requests
HTTP通信
WebサイトやAPIへのアクセス
Django
Web開発
本格的なWebアプリ開発
SQLAlchemy
データベース
ORMでDB操作(CRUD)
Pillow
画像処理
画像の読み込み・加工
scikit-learn
機械学習
分類・回帰などのML
SQLAlchemy — データベース操作
・SQLAlchemyのORMを使うと、PythonのクラスでDBテーブルを操作できます。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker
engine = create_engine('sqlite:///sample.db')
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
Base.metadata.create_all(engine)
session = sessionmaker(bind=engine)()
# Create
session.add(User(name='Taro', age=20))
session.commit()pip と仮想環境(venv)
・pipでライブラリを管理し、venvでプロジェクトごとに環境を分離します。
# pipの基本操作
pip install pandas
pip install --upgrade pandas
pip uninstall pandas
pip list
# 仮想環境の作成と利用
python -m venv env
# アクティベート(Windows)
env\Scripts\activate
# アクティベート(Mac/Linux)
source env/bin/activate
# 仮想環境内でインストール
pip install pandas
# 解除
deactivateクイズ
ライブラリの理解を確認しましょう。
次のうち、外部ライブラリ(PyPIからインストール)はどれですか?
クイズ 解答
次のうち、外部ライブラリ(PyPIからインストール)はどれですか?
datetime, os, randomは標準ライブラリです。pandasは外部ライブラリで、pip install pandasでインストールします。
Python基礎
まとめ
Python基礎編で学んだことを振り返ろう
Python基礎編の全体像
11章で学んだ内容を3つのステージに整理します。
変数・演算・型
print / input / ファイルI/O
コメント・PEP8
if / elif / else
while / for / range
リスト・タプル・辞書・集合
関数・モジュール
クラス・継承・多態性
例外処理・ライブラリ
学んだキーワード一覧
Python基礎編で登場した重要キーワードです。
- プログラミング / コード / インタプリタ / バイトコード
- 変数 / 代入 / データ型 / リテラル / エスケープシーケンス
- print / input / f文字列 / open / with
- if / elif / else / 比較演算子 / 論理演算子 / 短絡評価
- while / for / range / break / continue / 無限ループ
- リスト / タプル / 辞書 / 集合 / スライス / 内包表記
- enumerate / zip / sys.argv
- def / return / *args / **kwargs / スコープ / import
- class / __init__ / self / 継承 / property / 特殊メソッド
- try / except / else / finally / raise / 独自例外
- 標準ライブラリ / pip / venv / SQLAlchemy / PyPI
文法を覚え、アルゴリズムを考え、コードを書く。この繰り返しがプログラミングの力になる。Pythonなら、その一歩がとても簡単に踏み出せる。
— Pythonプログラミング基礎編 — 全体のまとめ