このシリーズについて
このブログでは、「基本情報技術者試験問題に挑戦しよう!」シリーズをはじめ、Pythonの短いプログラムを動かしながら仕組みを確かめる記事を扱っている。
このシリーズでは、「本ブログのコードを読める・動かせる」ことを目標に、Pythonの基礎を3回に分けて学んでいる。
- 第1回:変数・型・print
- 第2回:条件分岐・ループ・関数の引数・辞書
- 第3回(今回):クラスと標準ライブラリの読み方
(Windows11で実行する場合:PowerShell)
今回のコードも、これまでと同じく、py とだけ打って対話モードに入るのではなく、.py ファイルに保存してから py ファイル名.pyの形で実行してほしい。
今回のコードブロックは、どれも単独で完結しているので、1つずつ別のファイルに保存して試すことができる。
ちなみに、Mac/Linuxは、python3 ファイル名.pyで実行する。
なお、この記事で使用するコードは、筆者の学習用リポジトリ pc-labo-python-basic の 03_class_stdlib フォルダにまとめている。
クラスとは
クラスとは、「データ」と「そのデータを扱う処理(関数)」をひとまとめにした、モノの設計図である。
たとえば「商品」というモノなら、商品名・価格・数量というデータを持ち、「合計金額を計算する」という処理ができる。これをクラスとして定義しておくと、カメラ、テレビ、冷蔵庫といった個々の商品を、同じ設計図から何個でも作れる。設計図から作られた実物のことをインスタンス(オブジェクト)と呼ぶ。
【つくってみよう】商品を表すProductクラス
class Product:
"""商品を表すクラス"""
def __init__(self, name, price, quantity):
self.name = name # 商品名
self.price = price # 価格
self.quantity = quantity # 数量
def total(self):
"""価格x数量(在庫の合計金額)を返す"""
return self.price * self.quantity
def show(self):
print(f"{self.name}: {self.price:,}円 x {self.quantity}個 = {self.total():,}円")
items = [
Product("カメラ", 13000, 20),
Product("テレビ", 58000, 15),
Product("冷蔵庫", 65000, 8),
]
print("=== 商品一覧 ===")
for item in items:
item.show()実行結果
=== 商品一覧 ===
カメラ: 13,000円 x 20個 = 260,000円
テレビ: 58,000円 x 15個 = 870,000円
冷蔵庫: 65,000円 x 8個 = 520,000円
このコードで、クラスを読むうえで押さえておきたいポイントは次の3つである。
class Product::Productという名前のクラス(設計図)を定義している__init__:インスタンスを作るときに、自動的に最初に呼ばれる特別な関数である。Product("カメラ", 13000, 20)と書くと、この__init__が呼ばれて、商品名・価格・数量が保存される。前後にアンダースコア(_)が2つずつ付く点に注意したいself:「このインスタンス自身」を表す名前である。self.name = nameは、「このインスタンスのnameという項目に、引数で受け取ったnameを保存する」という意味になる。クラスの中で定義する関数(メソッド)は、第1引数にselfを書くのが一般的である。
item.show() のように、インスタンス.メソッド名() の形で呼び出す。total() の中でも self.price や self.quantity を使っているので、それぞれの商品ごとに、その商品の価格と数量で計算される。
なお、{self.price:,} の :, は、数値を3桁ごとにカンマ区切りで表示する書式指定子である(第1回の :08b や :3d の仲間)。
【つくってみよう】木の節を表すNodeクラス
このブログの「2分探索木」の記事では、木の節を表す Node クラスが登場する。先ほどのクラスの考え方を使えば、そのコードも読める。
class Node:
"""木の1つの節を表すクラス"""
def __init__(self, value, left=None, right=None):
self.value = value # 節の値
self.left = left # 左の子(無ければNone)
self.right = right # 右の子(無ければNone)
root = Node(17, left=Node(14), right=Node(19))
print("根:", root.value)
print("左の子:", root.left.value)
print("右の子:", root.right.value)実行結果
根: 17
左の子: 14
右の子: 19
left=None のように、第2回で学んだデフォルト引数が、__init__ にも使えている。None は「何も無い」ことを表す特別な値で、子を持たない節では、左右の子が None のままになる。
Node の中に、また Node を入れられる点がポイントである。root.left は Node(14) というインスタンスそのものなので、root.left.value のように . でつなげて、さらに中の値を取り出せる。この構造が、木のような階層的なデータを表現する土台になっている。
import と標準ライブラリ
Pythonには、最初から「標準ライブラリ」として、便利な機能がたくさん用意されている。これらを使うには、import で呼び出す。
import hashlib
from itertools import product
print("=== itertools.product ===")
for p, q in product([True, False], repeat=2):
print(p, q)
print()
print("=== hashlib.sha256 ===")
print(hashlib.sha256("hello".encode()).hexdigest())実行結果
=== itertools.product ===
True True
True False
False True
False False
=== hashlib.sha256 ===
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
import には2つの書き方がある。
import hashlib:モジュール全体を読み込む。使うときはhashlib.sha256(...)のように、モジュール名.を付けて呼び出すfrom itertools import product:モジュールの中から特定の機能だけを取り出す。使うときはproduct(...)のように、そのまま呼び出せる
product([True, False], repeat=2) は、True と False のすべての組み合わせを順に取り出す機能で、このブログの「命題の真理値」の記事で使っているものである。hashlib.sha256(...) は、データから固定長の値(ハッシュ値)を計算する機能で、「メッセージ認証」の記事に出てくる。
このブログでよく使う標準ライブラリ早見表
このブログのコードに出てくる主なモジュールを、「何のためのものか」だけ簡単にまとめておく。
| モジュール | 何をするものか | 使っている記事 |
|---|---|---|
itertools | 組み合わせなど、繰り返し処理を助ける機能 | 命題の真理値 |
random | 乱数を作る | システムの稼働率 |
sqlite3 | SQLiteデータベースを操作する | 関係モデル |
socket | ネットワーク通信(ソケット)を扱う | ポート番号 |
threading | 複数の処理を並行して動かす(スレッド) | ポート番号 |
hashlib | ハッシュ値(SHA-256など)を計算する | メッセージ認証 |
hmac | 鍵付きハッシュ(HMAC)を計算する | メッセージ認証 |
初めて見るモジュールに出会ったら、次のような方法で調べられる。
- 公式ドキュメント(Python標準ライブラリのリファレンス)で、モジュール名を検索する
- Pythonの対話モードで
help(モジュール名)を実行する(importしたあとに使う)
まとめ
- クラスは「データと処理をまとめた設計図」で、
classで定義し、そこから作った実物をインスタンスと呼ぶ __init__はインスタンスを作るときに最初に呼ばれる関数で、selfは「このインスタンス自身」を表すimportで標準ライブラリの機能を呼び出せる。import モジュール名とfrom モジュール名 import 機能名の2通りの書き方がある- このブログで使う
itertools、random、sqlite3、socket、hashlibなどは、それぞれ「何をするものか」を知っておくだけで、コードが格段に読みやすくなる
これで、「基本情報技術者試験問題に挑戦しよう!」シリーズの各記事のコードは、ひと通り読めるようになっているはずである。わからない部分があれば、実際に手を動かして、値を変えながら試してみてほしい。
(参考)筆者のリポジトリ
この記事で扱ったコードは、以下の筆者のGitHubリポジトリで公開している。



