PC-LABOを試すためのPython入門(第3回)~クラスと標準ライブラリの読み方~【GitHub対応】

プログラミング言語

このシリーズについて

このブログでは、「基本情報技術者試験問題に挑戦しよう!」シリーズをはじめ、Pythonの短いプログラムを動かしながら仕組みを確かめる記事を扱っている。

このシリーズでは、「本ブログのコードを読める・動かせる」ことを目標に、Pythonの基礎を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乱数を作るシステムの稼働率
sqlite3SQLiteデータベースを操作する関係モデル
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リポジトリで公開している。

GitHub – HappyTalk10/pc-labo-python-basic
Contribute to HappyTalk10/pc-labo-python-basic development by creating an account on GitHub.
タイトルとURLをコピーしました