STUDY GUIDE · オブジェクト指向型言語

期末試験対策 · 第9–10・12–14回本線 · 案β(MD正本)

OOL
期末 教科書ノート

テキスト正本は runs/ool-final/content/。入門で用語を固めてから、演習と同型コードを手で書くドリルへ。中間(第2–7回)は別サイト。第11回は休講想定で欠番。

出題範囲 · 入門 · 手書きドリル · 試験ハブ · 中間サイト

出題範囲と形式の推定

重要

期末試験の正式な問題形式は資料に明記されていない。以下は宿題・演習の型から推定した想定であり、断定ではない。

本線第9・10・12・13・14回+7/7追加(スコープ/ポリモーフィズム/標準・外部ライブラリ/tkinter/Canvas/継承復習)
復習第2–7回は中間サイトへ誘導: https://ool-midterm.pages.dev/
欠番 / OOS第1回(未入手)/第8回(中間試験日の可能性大)/第11回(休講想定・欠番)
日程メモ第14回資料: 7/21 休講、7/28 期末試験
推定形式(1) クラス実装+継承+ポリモーフィズム呼び出し (2) import/標準・外部ライブラリ (3) tkinter 部品+Var (4) Canvas 画像・move
狙い演習問題と同じ/ほぼ同じコードを白紙から書けること(用語暗記だけでは足りない)
答案型

期末でよく出る骨格チート

詳細は各ドリルの答案型。試験開始直後にこの形を思い出す。

# 継承+ポリ
class Parent: ...
class Child(Parent):
    def __init__(self, ...):
        super().__init__(...)
    def meth(self): ...
def call(obj): return obj.meth()

# import
import random / import math / from PIL import Image
import tkinter as tk

# GUI
base = tk.Tk()
# Widget + Var + pack + command
base.mainloop()

# Canvas 移動
canv.move(tag, dx, dy); canv.update()
# 絶対座標
canv.coords(tag, x, y)

今日のモード

初見の既定は「学ぶ」。ドリル強制はしない(expertise reversal)。

中間サイトへの誘導

第2–7回(クラス・self・継承の土台)の厚い解説は中間専用サイトに分離した。URL を増やさないため、期末は後半本線に集中する。

中間教科書を開く

用語を先に固める(スコープから)

正本は runs/ool-final/content/concepts/*.md(案β)。まずスコープ・変数・ポリモーフィズムを日常語で固め、長い実装はドリルへ。

入門を一通り読んでから本編・手書きドリルへ(入門完了前の本編 L3 飛ばし禁止)。

01

スコープ(すこーぷ)とは、

なぜ必要か: クラスや関数を書くと、見た目同じ `v` や `area` が何種類も出てくる。どれが生きているかを見誤ると、「さっき代入したのにエラー」「値が戻らない」が止まらない。スコープを先に押さえると、以降のクラス変数・ポリモーフィズムの説明がつながる。

変数が「どこまで使えるか」という**有効範囲**のこと。同じ名前でも、置いた場所が違えば別物として扱われる。

別名: 有効範囲。英語 scope。

関数の中で v=20 と書いた

その呼び出し中だけ 20 が見える

仕組み(言葉)

代入した場所のブロックが、その名前の寿命と見える範囲を決める。関数の中での代入は、その関数専用の枠を作ることが多い。ファイルの先頭(どの defclass にも入っていない場所)での代入は、ファイル全体から名前で参照できる枠になる。

教室の黒板(みんなから見える場所)と、自分のノート(自分の席だけで見える場所)がある、と考える。ノートに書いた答えは隣の席から見えない。プログラムでも「どの黒板/ノートに書いたか」がスコープ。

具体例
v = 10          # ファイル全体で見える側
def printer():
    v = 20      # この関数の中だけの別枠
    print(v)    # → 20
printer()
print(v)        # → 10(上の別枠は消えている)

前後比較(コード無し):

関数の中で v=20 と書いたその呼び出し中だけ 20 が見える
関数の外で print(v)ファイル先頭の 10 のまま(中の枠は消えた)

※「外」の基準点=その変数を定義した関数ブロックの外

よくある誤解

なぜ名前が同じ v なので、「1つの箱を上書きしている」と脳が読む。

NG「関数内で v=20 したから、外の print(v) も 20」と思う。

正し方関数内の代入で別枠のローカルが生まれる。外の枠は触っていない。

補足global 宣言で外を書き換える話は発展。講義の基本は「枠が分かれる」理解でよい。

試験での答え方

  1. 完成文: 「スコープとは、変数の有効範囲(どこまで使えるか)である。」
  2. 骨組み/表: 定義場所 → 見える範囲 → 寿命、の3列で答える。
  3. 採点語: 有効範囲/ローカル/グローバル/(クラスなら)インスタンス変数・クラス変数。
02

ローカル変数とグローバル変数とは、

なぜ必要か: 面積などの一時計算は、メソッドを出たら捨ててよいことが多い。一方、設定値のようにファイル全体で共有したい値もある。寿命を分けないと、「メソッドを抜けたあと `print(area)` したらエラー」や「意図せず全体の値を書き換えた」が起きる。

**ローカル**は、ある関数(またはメソッド)のブロックの中だけで生きる変数。**グローバル**は、ファイルのトップレベル(どの `def`/`class` の外でもない場所)で定義された変数で、ファイル全体から名前で参照できる。

別名: local / global。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

会議中だけのメモ用紙(ローカル)と、共用ホワイトボード(グローバル)。会議が終わるとメモ用紙は捨てるが、ホワイトボードの字は残る。

仕組み(言葉)

Python は「どこで代入したか」を見て枠を決める。関数の中で代入すると、その関数用の名前表に載る。トップレベルで代入すると、ファイル用の名前表に載る。メソッド内で self. 無しの代入はローカルであり、オブジェクトの属性にはならない。

会議中だけのメモ用紙(ローカル)と、共用ホワイトボード(グローバル)。会議が終わるとメモ用紙は捨てるが、ホワイトボードの字は残る。

具体例
g = 1                 # グローバル
def f():
    area = 3.14 * 2   # ローカル(f の中だけ)
    print(area)
f()
# print(area)  # → エラー(定義した関数ブロックの外からは見えない)
print(g)              # → 1
種類定義場所定義した関数の外から参照寿命
ローカル関数/メソッドの中不可呼び出しが終わるまで
グローバルファイル先頭(トップレベル)ファイル実行中

※「外」の基準点=その変数を定義した関数ブロックの外

よくある誤解

なぜメソッド内で area = … と書くと、「円の面積をオブジェクトが覚えた」ように見える。

NGself. 無しの area を、あとから c.area で取り出そうとする。

正し方area は呼び出し中の一時メモ。オブジェクトに残すなら self.area = …

補足クラス変数との違いは C03。

試験での答え方

  1. 完成文: 「ローカル=関数内だけ使える変数。グローバル=ファイル全体で使える変数。」
  2. 骨組み/表: 定義場所・外から参照できるか・寿命の3点対比。
  3. 採点語: ローカル/グローバル/有効範囲/(必要なら)寿命。
03

インスタンス変数とクラス変数とは、

なぜ必要か: 円ごとに違う半径はインスタンス変数。全円で共通の定数っぽい値やカウンタはクラス変数向き。混ぜると「1つの円を変えたら全部変わった」や「`self.` を付け忘れてローカルになった」が起きる。

**インスタンス変数**は、オブジェクト1つごとに持つデータ(`self.名前`)。**クラス変数**は、同じクラスのオブジェクトが**共有**するデータ(クラス本体に直接書いた変数)。

別名: インスタンス属性 / クラス属性。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

学籍番号は学生一人ひとり違う(インスタンス)。学校名は同じクラス(同じ学校)の全員で同じ札を見るイメージ(クラス変数)。

仕組み(言葉)

self.r = … は「今のこのオブジェクト専用の引き出し」にしまう。クラス本体の kind = … は「クラスの共用引き出し」。メソッド内で r = … のように self. 無しだと、それはローカル変数であり、どちらにも残らない。

学籍番号は学生一人ひとり違う(インスタンス)。学校名は同じクラス(同じ学校)の全員で同じ札を見るイメージ(クラス変数)。

※「共有」の基準点=同じクラスから作られた各インスタンスのあいだで、クラスに置いた1つの枠を見ている、という意味。

具体例
class Circle:
    kind = "円"           # クラス変数(共有)
    def __init__(self, r):
        self.r = r        # インスタンス変数(個体ごと)

a = Circle(2)
b = Circle(5)
print(a.r, b.r)           # → 2 5(別々)
print(a.kind, b.kind)     # → 円 円(同じ枠を見ている)
種類クラス外からの読み方クラス内での典型
インスタンス変数インスタンス.名前self.名前
クラス変数クラス.名前 または インスタンス.名前(読み出し)クラス本体に直接定義
よくある誤解

なぜself. を付け忘れると「変数を書いたつもり」になりやすい。

NGメソッド内 area = 3.14 * self.r ** 2 のあと print(obj.area) で取り出す。

正し方残したいなら self.area = …。付けない area はメソッド終了で消える。

補足クラス変数を インスタンス.名前 = で代入すると個体側に影ができることがある(発展)。

試験での答え方

  1. 完成文: 「インスタンス変数は個体ごと、クラス変数はクラスで共有する変数。」
  2. 骨組み/表: アクセス方法(self.クラス.)と「誰のものか」を書く。
  3. 採点語: インスタンス変数/クラス変数/self/共有(基準点付き)。
04

ポリモーフィズム(ぽりもーふぃずむ)とは、

なぜ必要か: 円も正方形も「面積を求める」なら、使う側は毎回クラス名で分岐したくない。同じ `area()` というボタンを押せば、中身は相手が勝手にやる——そう書けると、あとから新しい図形を足しても呼び出し側が壊れにくい。

**同じ呼び方(同じメソッド名)で、相手の種類ごとに違う処理をさせる**考え方。使う側は「相手が誰か」を細かく分けず、同じ窓口から呼べる。

別名: 多態性。本稿ではポリモーフィズム。

相手ごとに別関数を呼び分ける

同じ関数/同じメソッド名に渡す

仕組み(言葉)

異なるクラスに同じ名前のメソッドを用意する。呼び出し側は「そのオブジェクトのそのメソッド」を実行するだけなので、渡した相手のクラスに応じて中身が切り替わる。継承+オーバーライドでも同じ形になる(親の型として扱い、子の実装が動く)。

車種が違っても、発進は同じ「Aボタン」。押す動作は同じで、中のエンジンのかかり方は車ごとに違う。使う人は車の内部を知らなくてよい。

前後比較(コード無し):

相手ごとに別関数を呼び分ける同じ関数/同じメソッド名に渡す
「円用・正方形用」と分岐だらけ窓口は1つ、中身だけ違う
具体例
class Dog:
    def speak(self):
        return "わん"
class Cat:
    def speak(self):
        return "にゃ"
def intro(obj):
    return obj.speak()   # 同じ窓口
print(intro(Dog()))      # → わん
print(intro(Cat()))      # → にゃ
よくある誤解

なぜ「同じメソッド名」と「同じ処理」が頭の中でくっつく。

NGポリモーフィズム=中身も必ず同じ、と思い込む。

正し方名前(呼び方)は揃える。処理の中身はクラスごとに違ってよい(それが本丸)。

補足講義の車のたとえ=操作は統一、発進の仕方は違う。

試験での答え方

  1. 完成文: 「ポリモーフィズムとは、同じメソッド名で異なるクラスの異なる処理を呼び出せること。」
  2. 骨組み/表: 「同じ窓口」+「違う中身」+具体クラス名を1行ずつ。
  3. 採点語: 同じメソッド名/異なるクラス/一つの関数で扱う。
05

オーバーライド(おーばーらいど)とは、

なぜ必要か: 「動物は鳴く」は親で共通に置きたいが、犬は「わんわん」、蛇は「シャー」と変えたい。共通部分は親、違う部分だけ子で上書きすると、重複を減らしつつポリモーフィズムが使える。

親クラスで定義したメソッドを、子クラスが**同じ名前で書き直して上書き**すること。

別名: 上書き。英語 override。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

会社の「挨拶マニュアル(親)」がある。部署ごとに一言だけ差し替えるのがオーバーライド。マニュアル全体をゼロから別冊にするのではない。

仕組み(言葉)

子クラスに親と同じメソッド名があると、そのインスタンスでは子の定義が優先される。呼び出し側は obj.cry() のままでよい(ポリモーフィズムとセットで使う)。

会社の「挨拶マニュアル(親)」がある。部署ごとに一言だけ差し替えるのがオーバーライド。マニュアル全体をゼロから別冊にするのではない。

具体例
class Animal:
    def cry(self):
        return "鳴く"
class Dog(Animal):
    def cry(self):      # 同名で上書き
        return "わんわん"
print(Dog().cry())      # → わんわん(親の「鳴く」ではない)
用語役割
親の cry共通の型・デフォルト動作
子の cry同じ入り口で中身だけ差し替え
よくある誤解

なぜ継承とセットで出るので、「継承すれば自動で鳴き方が変わる」と思いがち。

NG子クラスを作っただけで、親と同じ "鳴く" のままなのに「オーバーライドした」と言う。

正し方同名メソッドを子側に書いて初めて上書き。書かなければ親のまま。

補足親の処理も使いたいときは super()(C13/ドリル D10)。

試験での答え方

  1. 完成文: 「オーバーライドとは、親のメソッドを子が同名で上書きすること。」
  2. 骨組み/表: 親の定義 → 子の同名定義 → 呼び出し結果、の順。
  3. 採点語: 上書き/同名メソッド/親クラス・子クラス。
06

ライブラリ・モジュール・パッケージとは、

なぜ必要か: 毎回ゼロから乱数や日付を書くのは無駄で、ミスも増える。用意された道具を `import` して使うと、試験の実装も短く正確になる。階層の名前を取り違えると「何を import すればいいか」が曖昧になる。

プログラミングの**道具セット**の階層。ライブラリが大きな道具箱、その中の一つ一つの道具(`.py`)がモジュール、モジュールをフォルダにまとめたものがパッケージ。

別名: 本稿ではこの呼び方のみ(道具箱たとえ)。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

工具箱一式=**ライブラリ**。中のプラスドライバ一本=**モジュール**。ドライバセットの引き出し(複数モジュール入り)=**パッケージ**。ねじを締める動作が、モジュール内の関数やクラスのメソッド。

仕組み(言葉)

使いたい道具を名前で読み込むと、その中の関数・クラス・定数が使える。標準で付いてくるものと、後から入れるものがある(C08)。

工具箱一式=ライブラリ。中のプラスドライバ一本=モジュール。ドライバセットの引き出し(複数モジュール入り)=パッケージ。ねじを締める動作が、モジュール内の関数やクラスのメソッド。

具体例
import math
print(math.pi)          # モジュール math の定数
from math import sqrt
print(sqrt(9))          # → 3.0
用語役割(関係)
ライブラリモジュール/パッケージの集まり(道具箱全体)
モジュール1つの .py(1つの道具)
パッケージ複数モジュールをまとめたディレクトリ

部品の列挙だけで終わらず、「箱→中の道具→使い方(関数/クラス)」の関係で覚える。

よくある誤解

なぜ「ライブラリ」「モジュール」が日常語でも似た感じで使われる。

NG「ライブラリを import した」とだけ言い、実際に読んだ .py(モジュール)名を言えない。

正し方コード上で読む単位はだいたいモジュール名(例: math)。ライブラリは「その仲間全体」の呼び名。

補足講義スライドのドライバたとえと対応づける。

試験での答え方

  1. 完成文: 「ライブラリは道具箱、モジュールは中の道具(.py)、パッケージは道具のセット。」
  2. 骨組み/表: 三者の関係図(箱⊃パッケージ⊃モジュール、または箱⊃モジュール)。
  3. 採点語: ライブラリ/モジュール/パッケージ/import。
07

import / from / as とは、

なぜ必要か: 標準ライブラリでも外部でも、読み込まないと使えないものが多い(組み込み関数は例外)。書き方を間違えると `NameError` や長い名前の打ち間違いが続く。

他のファイル(モジュール)の道具を、今のプログラムに**読み込んで名前を付ける**書き方。`import` 全体、`from` 一部、`as` は短い別名。

別名: 読み込み文。from / as を含む。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

本棚から本を借りる。 - `import calendar`=本を一冊まるごと借り、読むとき「calendar の ○○」と言う。 - `from calendar import month`=必要な章だけコピーして、`month` と短く

仕組み(言葉)

import はモジュールの名前空間を今のファイルに結びつける。from はそこから特定の名前だけを今の名前表に取り込む。as は結びつけた名前のラベルを短くするだけ。

本棚から本を借りる。

  • import calendar=本を一冊まるごと借り、読むとき「calendar の ○○」と言う。
  • from calendar import month=必要な章だけコピーして、month と短く呼ぶ。
  • as cal=借りた本に「cal」という付箋名を付ける。
具体例
import calendar
calendar.month(2026, 7)

import calendar as cal
cal.month(2026, 7)

from calendar import month, isleap
month(2026, 7)
isleap(2024)   # → True
書き方効果
import 名名.関数 で使う
import 名 as 別名別名.関数
from 名 import 部品部品 を直接呼ぶ

組み込み(例: print)は import 不要。標準モジュールは import が必要——この差が試験のひっかけになりやすい。

よくある誤解

なぜfrom math import sqrt のあと、つい math.sqrt と書いてしまう(またはその逆)。

NGfrom math import sqrt なのに math.sqrt(9) で呼ぶ。

正し方取り込んだ書き方に合わせて呼ぶfrom なら sqrt(9)import math なら math.sqrt(9)

補足abs は組み込み、math.fabs はモジュール側(第10回の対比)。

試験での答え方

  1. 完成文: 「import でモジュールを読み、from で部品を取り、as で別名を付ける。」
  2. 骨組み/表: 3書き方と呼び出し形の対応表。
  3. 採点語: import/from/as/モジュール名.関数名。
08

標準ライブラリと外部ライブラリとは、

なぜ必要か: 乱数や数学は標準で足りることが多い。画像処理(Pillow)のように、標準に無い道具は `pip install` してから使う。区別できないと「なぜエラー?」の切り分けができない。

**標準**は Python を入れたときに最初から付いてくる道具(ただしモジュールは `import` が必要)。**外部**は別途インストールするもの(例: Pillow)。どちらも使い始めは `import`。

別名: 標準ライブラリ / 外部ライブラリ。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

スマホの初期アプリ=標準。アプリストアから追加したアプリ=外部。どちらも「開いて使う」必要があるが、後者は先にダウンロード(インストール)がいる。

仕組み(言葉)

標準モジュールは環境にあらかじめある。外部は PyPI などから入れ、そのあと標準と同じく import して関数/クラスを使う。画像なら open でオブジェクトを得て、show や属性(height 等)で操作する。

スマホの初期アプリ=標準。アプリストアから追加したアプリ=外部。どちらも「開いて使う」必要があるが、後者は先にダウンロード(インストール)がいる。

具体例

標準(import のみ):

import random
print(random.randint(1, 6))

外部(インストール後):

from PIL import Image
img = Image.open("hana.jpg")
img.show()
標準ライブラリ外部ライブラリ
入手Python 同梱pip install など
使用importインストール後に import
random, math, tkinterPillow(PIL

※ Pillow はパッケージ名と import 名(PIL)が違う点に注意。

よくある誤解

なぜ「標準=import 不要」と思い込む(組み込み関数と混同)。

NGrandom.randint を import なしで使う。

正し方組み込み関数print, abs 等)だけが import 不要。標準モジュールは import 必要。

補足長い画像加工チェーンはドリル/宿題側。概念では open→show まで。

試験での答え方

  1. 完成文: 「標準は最初から付く(import は要)。外部はインストール後に import して使う。」
  2. 骨組み/表: 標準 vs 外部 vs 組み込みの3列。
  3. 採点語: 標準ライブラリ/外部ライブラリ/pip/import。
09

tkinter(てぃーきんたー)とは、

なぜ必要か: 期末本線ではチェック/ラジオ/キャンバスなど「画面を作って動かす」問題が出る想定。コンソールの `print` だけでは足りない。窓の作り方と部品の置き方の型を持っておく必要がある。

Python 標準の **GUI(画面付きアプリ)用ツールキット**。窓(ウィンドウ)の上にボタンやラベルなどの部品(ウィジェット)を置いて、クリックなどの操作に処理をつなぐ。

別名: Tkinter / GUI ツールキット。

部品を作っただけ

まだ画面に並ばない

仕組み(言葉)

  1. Tk で土台の窓を作る。
  2. ButtonLabel など部品クラスでウィジェットを作る(親は土台)。
  3. pack 等で並べる。
  4. 必要なら command で関数を結びつける。
  5. mainloop で表示を維持する。

長い画面(飲料UI・攻撃ボタン一式)はドリル側。

紙の工作キット。土台の厚紙がメインウィンドウ、シールがボタンやラベル。シールを貼る=pack などで配置。押したら動く仕組みを紐づける=command

具体例
import tkinter as tk
base = tk.Tk()
btn = tk.Button(base, text="PUSH!!")
btn.pack()
base.mainloop()   # 画面を出し続ける

前後比較(コード無し):

部品を作っただけまだ画面に並ばない
pack(など)で配置見える位置に並ぶ
mainloop窓が開いたまま操作を待ち続ける
よくある誤解

なぜ部品を生成した瞬間に画面に出ると思いがち。

NGButton(...) だけで packmainloop も書かない。

正し方作る・置く・回すの3段。置かないと見えない。回さないと一瞬で終わる/固まる。

補足side / anchor は配置の微調整(第12回)。

試験での答え方

  1. 完成文: 「tkinter は GUI 用の標準ライブラリで、窓にウィジェットを置いて操作する。」
  2. 骨組み/表: Tk → 部品生成 → pack →(command)→ mainloop。
  3. 採点語: tkinter/ウィジェット/pack/mainloop。
10

ウィジェット変数(StringVar / BooleanVar / IntVar)とは、

なぜ必要か: 普通の Python 変数だけだと、チェックのオンオフや入力文字を部品から取り出しにくい。ウィジェット変数をはさむと、「今チェックされているか」「今選ばれている value」を試験で聞かれても答えられる。

画面の部品(入力欄・チェック・ラジオ)と**連動する専用の変数オブジェクト**。部品の状態が変わると値が変わり、`get` / `set` で読み書きする。

別名: コントロール変数。StringVar 等。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

スイッチとランプをつなぐ電線。スイッチ(チェックボタン)を倒すと、電線の先の状態表示(変数)が True/False に変わる。ランプを直接いじるのではなく、電線(変数)を見る。

仕組み(言葉)

部品に variable=textvariable= でウィジェット変数を渡す。ユーザー操作で部品が変わると変数側も更新される。プログラムから set すれば初期表示も変えられる。状態の取得は get

スイッチとランプをつなぐ電線。スイッチ(チェックボタン)を倒すと、電線の先の状態表示(変数)が True/False に変わる。ランプを直接いじるのではなく、電線(変数)を見る。

※「連動/見える」の基準点=そのウィジェット変数を variable / textvariable で結びつけた部品から見た状態。

具体例
import tkinter as tk
base = tk.Tk()
bln = tk.BooleanVar()
bln.set(True)                    # 初期オン
cb = tk.Checkbutton(base, text="ON", variable=bln)
cb.pack()
# あとで: bln.get() → True/False
クラス向き
StringVar文字列(Entry / Label の textvariable)
BooleanVarTrue/False(Checkbutton)
IntVar整数(Radiobutton の value と一致させる)
よくある誤解

なぜ普通の x = True とウィジェット変数を同一視する。

NGCheckbutton に普通の bool を渡して状態を取ろうとする。

正し方BooleanVar 等のインスタンスを渡し、get/set で扱う。

補足ラジオは IntVar の値と各ボタンの value が一致したとき選ばれる。

試験での答え方

  1. 完成文: 「ウィジェット変数は部品と連動する変数で、get/set で状態を扱う。」
  2. 骨組み/表: 種類(String/Boolean/Int)と典型ウィジェットの対応。
  3. 採点語: StringVar/BooleanVar/IntVar/get/set/variable。
11

チェックボタンとラジオボタンとは、

なぜ必要か: 飲料を複数注文したいならチェック、ランチセットを1つだけ選ぶならラジオ、と用途が違う。変数の型も違う(BooleanVar の並び vs IntVar+value)。取り違えると UI 仕様が宿題と食い違う。

どちらも「選ぶ」ための GUI 部品。**チェック**はグループ内で**複数オン**にできる。**ラジオ**はグループ内で**どれか1つだけ**選ぶ。

別名: Checkbutton / Radiobutton。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

学食の伝票。トッピングをいくつでも付ける=チェック。日替わりA/B/Cはどれか一つ=ラジオ(昔のラジオの押しボタンは1つ押すと他が戻る)。

仕組み(言葉)

チェックは部品ごとにオンオフの枠を持つ。ラジオはグループで1つの IntVar を共有し、各ボタンに違う value を付ける。ユーザーが押すと変数がその value に変わり、一致するボタンだけが選択表示になる。

学食の伝票。トッピングをいくつでも付ける=チェック。日替わりA/B/Cはどれか一つ=ラジオ(昔のラジオの押しボタンは1つ押すと他が戻る)。

具体例

チェック(複数可):

# bln1, bln2 はそれぞれ BooleanVar
# Checkbutton(..., variable=bln1)
# Checkbutton(..., variable=bln2)
# 両方 True になり得る

ラジオ(1つだけ):

# v = IntVar(); v.set(1)
# Radiobutton(..., variable=v, value=1)
# Radiobutton(..., variable=v, value=2)
# 選ばれているのは v.get() と一致する value の1つ
チェックボタンラジオボタン
同時選択複数可グループ内1つ
典型変数BooleanVar(部品ごと)IntVar(グループで共有)
状態の見方get() が True/False共有変数の get() が value
よくある誤解

なぜ「選ぶ部品」として同じ棚に並んで見える。

NGランチ3択に Checkbutton を3つ付けて「1つだけ選ばせる」つもりになる。

正し方1つだけならラジオ+共有 IntVar。複数可ならチェック+BooleanVar 複数。

補足for+辞書で部品生成を短くするのはドリル(D06/D07)。

試験での答え方

  1. 完成文: 「チェックは複数選択可、ラジオはグループ内で単一選択。」
  2. 骨組み/表: 上表+変数の取り方(get)。
  3. 採点語: Checkbutton/Radiobutton/BooleanVar/IntVar/value。
12

Canvas(きゃんばす)と move / coords とは、

なぜ必要か: キャラ画像を出したり、攻撃ボタンで相手方向へ動かしたりする宿題の土台。相対移動と絶対移動を混同すると「一回動いたら変な場所に飛ぶ」になる。

Canvas は、線・円・画像・文字を載せる**絵を描く台**。`move` は今の位置から相対的にずらす。`coords` は中心座標を絶対指定で置き直す。

別名: キャンバス。move / coords。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

黒板にマグネットを貼る台=Canvas。 - `move`: 「今の場所から右へ10、下へ50」と**ずらす**(相対)。 - `coords`: 「中心を (200, 300) に**置き直す**」(絶対)。

仕組み(言葉)

create_image などで図形にタグを付ける。あとからタグを指定して動かす。move は差分、coords は行き先の座標そのもの。アニメっぽく見せるときは少し動かして update する、という流れ(詳細は追加PDF・ドリル)。

黒板にマグネットを貼る台=Canvas。

  • move: 「今の場所から右へ10、下へ50」とずらす(相対)。
  • coords: 「中心を (200, 300) に置き直す」(絶対)。

※「見える」の基準点=メインウィンドウ上の Canvas 座標系(左上がだいたい (0,0)、右が +x、下が +y)。画像は指定座標が中心になることが多い。

具体例
# canv は Canvas のインスタンス、タグ "hero" の画像があるとする
canv.move("hero", 10, 50)       # 相対: 右10・下50
canv.coords("hero", 200, 300)   # 絶対: 中心を (200,300)
canv.update()                   # 今の設定で画面を更新
メソッド意味
move(タグ, dx, dy)相対移動
coords(タグ, x, y)絶対座標(中心)
update表示を現状に合わせる

長い攻撃ループや点滅はドリル D08。概念では3語の差だけでよい。

よくある誤解

なぜどちらも「画像が動く」ので同じに見える。

NG「相手の座標へ行きたい」のに毎回 move だけで済ませようとして位置が積み上がる/足りない。

正し方ずらすなら move、位置を決め打ちするなら coords。目的で選ぶ。

補足tkinter は png 向き。jpg は非対応、と講義で注意あり。

試験での答え方

  1. 完成文: 「Canvas は図形・画像の台。move は相対、coords は絶対位置。」
  2. 骨組み/表: move / coords / update の役割表。
  3. 採点語: Canvas/create_image/move/coords/update/タグ。
13

継承と super とは、

なぜ必要か: 本・雑誌・漫画で「タイトルと値段」は共通、「発行月」「巻」は違う。共通を親に置き、子は差分だけ足す。共通表示を親の `display` に任せると、宿題の Book 系が書ける。

**継承**は、親クラスの仕組みを子が引き継ぐこと。**`super()`** は、子の中から**親の同名処理(よくあるのはコンストラクタや display)を呼び出す窓口**。

別名: 継承 / super()。

同じ名前/同じ見た目だと、全部ひとまとめに見えてしまう

名前と住所は家族共通の台帳(親)。自分の趣味欄だけ子が足す。台帳の共通欄を書くときは「親の書き方を呼ぶ」=`super()`。全部を子がゼロから書き直す必要はない。

仕組み(言葉)

子クラスの定義に親を書く(class Comic(Book):)。子の __init__ で親の初期化を呼ばないと、親が持つべき属性が揃わないことがある。display をオーバーライドしつつ super().display() で共通出力を再利用する、というのが第14回の型。

名前と住所は家族共通の台帳(親)。自分の趣味欄だけ子が足す。台帳の共通欄を書くときは「親の書き方を呼ぶ」=super()。全部を子がゼロから書き直す必要はない。

具体例
class Book:
    def __init__(self, name, price):
        self.name = name
    def display(self):
        print(self.name)

class Comic(Book):
    def __init__(self, name, price, vol):
        super().__init__(name, price)
        self.vol = vol

display の差分呼び出しと Magazine 全文はドリル D10。)

手順子がやること
コンストラクタsuper().__init__(…) で共通引数を親へ
displaysuper().display() のあと差分を表示
呼び出し同じ display 名でポリモーフィズム

Magazine/Comic の全文と指定インスタンスはドリル D10。

よくある誤解

なぜ「継承した=親のコンストラクタも自動」と思い込む。

NG子の __init__self.name だけ足し、super().__init__ を忘れる。

正し方共通の初期化は super().__init__ で親に渡す(講義の指示どおり)。

補足ポリモーフィズムで同じ関数から display を呼ぶのは D10。

試験での答え方

  1. 完成文: 「継承で親を引き継ぎ、super で親の処理を子から呼ぶ。」
  2. 骨組み/表: __init__display それぞれで super を使う順。
  3. 採点語: 継承/親クラス/子クラス/super/オーバーライド。

試験項目ハブ

B

ポリモーフィズム

同名メソッド・オーバーライド

本編の読み順

  1. §A スコープ
  2. §B ポリモーフィズム
  3. §C 標準・外部ライブラリ
  4. §D tkinter
  5. §E Canvas・GameCharacter
  6. §F Book 継承(第14回)

§A スコープ

入門カードと同じ正本を、章として通読できるように再掲(薄くしていない)。

スコープ(すこーぷ)とは、

一言(日常語)

変数が「どこまで使えるか」という有効範囲のこと。同じ名前でも、置いた場所が違えば別物として扱われる。

なぜ必要か(試験メタだけ禁止)

クラスや関数を書くと、見た目同じ varea が何種類も出てくる。どれが生きているかを見誤ると、「さっき代入したのにエラー」「値が戻らない」が止まらない。スコープを先に押さえると、以降のクラス変数・ポリモーフィズムの説明がつながる。

たとえ(コードより先)

教室の黒板(みんなから見える場所)と、自分のノート(自分の席だけで見える場所)がある、と考える。ノートに書いた答えは隣の席から見えない。プログラムでも「どの黒板/ノートに書いたか」がスコープ。

最小玩具例(長い実装禁止)

v = 10          # ファイル全体で見える側
def printer():
    v = 20      # この関数の中だけの別枠
    print(v)    # → 20
printer()
print(v)        # → 10(上の別枠は消えている)

前後比較(コード無し):

関数の中で v=20 と書いたその呼び出し中だけ 20 が見える
関数の外で print(v)ファイル先頭の 10 のまま(中の枠は消えた)

※「外」の基準点=その変数を定義した関数ブロックの外

仕組み(言葉)

代入した場所のブロックが、その名前の寿命と見える範囲を決める。関数の中での代入は、その関数専用の枠を作ることが多い。ファイルの先頭(どの defclass にも入っていない場所)での代入は、ファイル全体から名前で参照できる枠になる。

よくある誤解(音読一発短文)

  • なぜ起きるか: 名前が同じ v なので、「1つの箱を上書きしている」と脳が読む。
  • NG例: 「関数内で v=20 したから、外の print(v) も 20」と思う。
  • 正しい見方: 関数内の代入で別枠のローカルが生まれる。外の枠は触っていない。
  • ※補足(任意1行): global 宣言で外を書き換える話は発展。講義の基本は「枠が分かれる」理解でよい。

試験答え方

  1. 完成文: 「スコープとは、変数の有効範囲(どこまで使えるか)である。」
  2. 骨組み/表: 定義場所 → 見える範囲 → 寿命、の3列で答える。
  3. 採点語: 有効範囲/ローカル/グローバル/(クラスなら)インスタンス変数・クラス変数。

ローカル変数とグローバル変数とは、

一言(日常語)

ローカルは、ある関数(またはメソッド)のブロックの中だけで生きる変数。グローバルは、ファイルのトップレベル(どの defclass の外でもない場所)で定義された変数で、ファイル全体から名前で参照できる。

なぜ必要か(試験メタだけ禁止)

面積などの一時計算は、メソッドを出たら捨ててよいことが多い。一方、設定値のようにファイル全体で共有したい値もある。寿命を分けないと、「メソッドを抜けたあと print(area) したらエラー」や「意図せず全体の値を書き換えた」が起きる。

たとえ(コードより先)

会議中だけのメモ用紙(ローカル)と、共用ホワイトボード(グローバル)。会議が終わるとメモ用紙は捨てるが、ホワイトボードの字は残る。

最小玩具例(長い実装禁止)

g = 1                 # グローバル
def f():
    area = 3.14 * 2   # ローカル(f の中だけ)
    print(area)
f()
# print(area)  # → エラー(定義した関数ブロックの外からは見えない)
print(g)              # → 1
種類定義場所定義した関数の外から参照寿命
ローカル関数/メソッドの中不可呼び出しが終わるまで
グローバルファイル先頭(トップレベル)ファイル実行中

※「外」の基準点=その変数を定義した関数ブロックの外

仕組み(言葉)

Python は「どこで代入したか」を見て枠を決める。関数の中で代入すると、その関数用の名前表に載る。トップレベルで代入すると、ファイル用の名前表に載る。メソッド内で self. 無しの代入はローカルであり、オブジェクトの属性にはならない。

よくある誤解(音読一発短文)

  • なぜ起きるか: メソッド内で area = … と書くと、「円の面積をオブジェクトが覚えた」ように見える。
  • NG例: self. 無しの area を、あとから c.area で取り出そうとする。
  • 正しい見方: area は呼び出し中の一時メモ。オブジェクトに残すなら self.area = …
  • ※補足(任意1行): クラス変数との違いは C03。

試験答え方

  1. 完成文: 「ローカル=関数内だけ使える変数。グローバル=ファイル全体で使える変数。」
  2. 骨組み/表: 定義場所・外から参照できるか・寿命の3点対比。
  3. 採点語: ローカル/グローバル/有効範囲/(必要なら)寿命。

インスタンス変数とクラス変数とは、

一言(日常語)

インスタンス変数は、オブジェクト1つごとに持つデータ(self.名前)。クラス変数は、同じクラスのオブジェクトが共有するデータ(クラス本体に直接書いた変数)。

なぜ必要か(試験メタだけ禁止)

円ごとに違う半径はインスタンス変数。全円で共通の定数っぽい値やカウンタはクラス変数向き。混ぜると「1つの円を変えたら全部変わった」や「self. を付け忘れてローカルになった」が起きる。

たとえ(コードより先)

学籍番号は学生一人ひとり違う(インスタンス)。学校名は同じクラス(同じ学校)の全員で同じ札を見るイメージ(クラス変数)。

※「共有」の基準点=同じクラスから作られた各インスタンスのあいだで、クラスに置いた1つの枠を見ている、という意味。

最小玩具例(長い実装禁止)

class Circle:
    kind = "円"           # クラス変数(共有)
    def __init__(self, r):
        self.r = r        # インスタンス変数(個体ごと)

a = Circle(2)
b = Circle(5)
print(a.r, b.r)           # → 2 5(別々)
print(a.kind, b.kind)     # → 円 円(同じ枠を見ている)
種類クラス外からの読み方クラス内での典型
インスタンス変数インスタンス.名前self.名前
クラス変数クラス.名前 または インスタンス.名前(読み出し)クラス本体に直接定義

仕組み(言葉)

self.r = … は「今のこのオブジェクト専用の引き出し」にしまう。クラス本体の kind = … は「クラスの共用引き出し」。メソッド内で r = … のように self. 無しだと、それはローカル変数であり、どちらにも残らない。

よくある誤解(音読一発短文)

  • なぜ起きるか: self. を付け忘れると「変数を書いたつもり」になりやすい。
  • NG例: メソッド内 area = 3.14 * self.r ** 2 のあと print(obj.area) で取り出す。
  • 正しい見方: 残したいなら self.area = …。付けない area はメソッド終了で消える。
  • ※補足(任意1行): クラス変数を インスタンス.名前 = で代入すると個体側に影ができることがある(発展)。

試験答え方

  1. 完成文: 「インスタンス変数は個体ごと、クラス変数はクラスで共有する変数。」
  2. 骨組み/表: アクセス方法(self.クラス.)と「誰のものか」を書く。
  3. 採点語: インスタンス変数/クラス変数/self/共有(基準点付き)。

§A スコープ — 手で解く入口

なぜ今この演習か: 概念を言葉で押さえたあと、宿題同型を途中式(完成コード)で一度通すため。

求めるもの: 対応ドリルの worked を写経せず理解しながら追えること
使う定義: 上の本編セクションの用語
  1. 与件を音読する
  2. 答案型(クラス/import/部品)を紙に書く
  3. worked の各行の「なぜ」を口で言えるか確認する
  4. fade → solo へ進む(別 surface)
詳細な完成コードはコーディングドリル(MD drills)へ

答案文: 「概念は入門・本編、長い実装はドリルで書く」

部分点: 用語の完成文/ドリルの採点語

考察: コード科目では L3 の手数の本体がドリルの worked にある。ここでは飛ばさずハブとして接続する。

§B ポリモーフィズム

入門カードと同じ正本を、章として通読できるように再掲(薄くしていない)。

ポリモーフィズム(ぽりもーふぃずむ)とは、

一言(日常語)

同じ呼び方(同じメソッド名)で、相手の種類ごとに違う処理をさせる考え方。使う側は「相手が誰か」を細かく分けず、同じ窓口から呼べる。

なぜ必要か(試験メタだけ禁止)

円も正方形も「面積を求める」なら、使う側は毎回クラス名で分岐したくない。同じ area() というボタンを押せば、中身は相手が勝手にやる——そう書けると、あとから新しい図形を足しても呼び出し側が壊れにくい。

たとえ(コードより先)

車種が違っても、発進は同じ「Aボタン」。押す動作は同じで、中のエンジンのかかり方は車ごとに違う。使う人は車の内部を知らなくてよい。

前後比較(コード無し):

相手ごとに別関数を呼び分ける同じ関数/同じメソッド名に渡す
「円用・正方形用」と分岐だらけ窓口は1つ、中身だけ違う

最小玩具例(長い実装禁止)

class Dog:
    def speak(self):
        return "わん"
class Cat:
    def speak(self):
        return "にゃ"
def intro(obj):
    return obj.speak()   # 同じ窓口
print(intro(Dog()))      # → わん
print(intro(Cat()))      # → にゃ

仕組み(言葉)

異なるクラスに同じ名前のメソッドを用意する。呼び出し側は「そのオブジェクトのそのメソッド」を実行するだけなので、渡した相手のクラスに応じて中身が切り替わる。継承+オーバーライドでも同じ形になる(親の型として扱い、子の実装が動く)。

よくある誤解(音読一発短文)

  • なぜ起きるか: 「同じメソッド名」と「同じ処理」が頭の中でくっつく。
  • NG例: ポリモーフィズム=中身も必ず同じ、と思い込む。
  • 正しい見方: 名前(呼び方)は揃える。処理の中身はクラスごとに違ってよい(それが本丸)。
  • ※補足(任意1行): 講義の車のたとえ=操作は統一、発進の仕方は違う。

試験答え方

  1. 完成文: 「ポリモーフィズムとは、同じメソッド名で異なるクラスの異なる処理を呼び出せること。」
  2. 骨組み/表: 「同じ窓口」+「違う中身」+具体クラス名を1行ずつ。
  3. 採点語: 同じメソッド名/異なるクラス/一つの関数で扱う。

オーバーライド(おーばーらいど)とは、

一言(日常語)

親クラスで定義したメソッドを、子クラスが同じ名前で書き直して上書きすること。

なぜ必要か(試験メタだけ禁止)

「動物は鳴く」は親で共通に置きたいが、犬は「わんわん」、蛇は「シャー」と変えたい。共通部分は親、違う部分だけ子で上書きすると、重複を減らしつつポリモーフィズムが使える。

たとえ(コードより先)

会社の「挨拶マニュアル(親)」がある。部署ごとに一言だけ差し替えるのがオーバーライド。マニュアル全体をゼロから別冊にするのではない。

最小玩具例(長い実装禁止)

class Animal:
    def cry(self):
        return "鳴く"
class Dog(Animal):
    def cry(self):      # 同名で上書き
        return "わんわん"
print(Dog().cry())      # → わんわん(親の「鳴く」ではない)
用語役割
親の cry共通の型・デフォルト動作
子の cry同じ入り口で中身だけ差し替え

仕組み(言葉)

子クラスに親と同じメソッド名があると、そのインスタンスでは子の定義が優先される。呼び出し側は obj.cry() のままでよい(ポリモーフィズムとセットで使う)。

よくある誤解(音読一発短文)

  • なぜ起きるか: 継承とセットで出るので、「継承すれば自動で鳴き方が変わる」と思いがち。
  • NG例: 子クラスを作っただけで、親と同じ "鳴く" のままなのに「オーバーライドした」と言う。
  • 正しい見方: 同名メソッドを子側に書いて初めて上書き。書かなければ親のまま。
  • ※補足(任意1行): 親の処理も使いたいときは super()(C13/ドリル D10)。

試験答え方

  1. 完成文: 「オーバーライドとは、親のメソッドを子が同名で上書きすること。」
  2. 骨組み/表: 親の定義 → 子の同名定義 → 呼び出し結果、の順。
  3. 採点語: 上書き/同名メソッド/親クラス・子クラス。

§B ポリモーフィズム — 手で解く入口

なぜ今この演習か: 概念を言葉で押さえたあと、宿題同型を途中式(完成コード)で一度通すため。

求めるもの: 対応ドリルの worked を写経せず理解しながら追えること
使う定義: 上の本編セクションの用語
  1. 与件を音読する
  2. 答案型(クラス/import/部品)を紙に書く
  3. worked の各行の「なぜ」を口で言えるか確認する
  4. fade → solo へ進む(別 surface)
詳細な完成コードはコーディングドリル(MD drills)へ

答案文: 「概念は入門・本編、長い実装はドリルで書く」

部分点: 用語の完成文/ドリルの採点語

考察: コード科目では L3 の手数の本体がドリルの worked にある。ここでは飛ばさずハブとして接続する。

§C ライブラリ

入門カードと同じ正本を、章として通読できるように再掲(薄くしていない)。

ライブラリ・モジュール・パッケージとは、

一言(日常語)

プログラミングの道具セットの階層。ライブラリが大きな道具箱、その中の一つ一つの道具(.py)がモジュール、モジュールをフォルダにまとめたものがパッケージ。

なぜ必要か(試験メタだけ禁止)

毎回ゼロから乱数や日付を書くのは無駄で、ミスも増える。用意された道具を import して使うと、試験の実装も短く正確になる。階層の名前を取り違えると「何を import すればいいか」が曖昧になる。

たとえ(コードより先)

工具箱一式=ライブラリ。中のプラスドライバ一本=モジュール。ドライバセットの引き出し(複数モジュール入り)=パッケージ。ねじを締める動作が、モジュール内の関数やクラスのメソッド。

最小玩具例(長い実装禁止)

import math
print(math.pi)          # モジュール math の定数
from math import sqrt
print(sqrt(9))          # → 3.0
用語役割(関係)
ライブラリモジュール/パッケージの集まり(道具箱全体)
モジュール1つの .py(1つの道具)
パッケージ複数モジュールをまとめたディレクトリ

部品の列挙だけで終わらず、「箱→中の道具→使い方(関数/クラス)」の関係で覚える。

仕組み(言葉)

使いたい道具を名前で読み込むと、その中の関数・クラス・定数が使える。標準で付いてくるものと、後から入れるものがある(C08)。

よくある誤解(音読一発短文)

  • なぜ起きるか: 「ライブラリ」「モジュール」が日常語でも似た感じで使われる。
  • NG例: 「ライブラリを import した」とだけ言い、実際に読んだ .py(モジュール)名を言えない。
  • 正しい見方: コード上で読む単位はだいたいモジュール名(例: math)。ライブラリは「その仲間全体」の呼び名。
  • ※補足(任意1行): 講義スライドのドライバたとえと対応づける。

試験答え方

  1. 完成文: 「ライブラリは道具箱、モジュールは中の道具(.py)、パッケージは道具のセット。」
  2. 骨組み/表: 三者の関係図(箱⊃パッケージ⊃モジュール、または箱⊃モジュール)。
  3. 採点語: ライブラリ/モジュール/パッケージ/import。

import / from / as とは、

一言(日常語)

他のファイル(モジュール)の道具を、今のプログラムに読み込んで名前を付ける書き方。import 全体、from 一部、as は短い別名。

なぜ必要か(試験メタだけ禁止)

標準ライブラリでも外部でも、読み込まないと使えないものが多い(組み込み関数は例外)。書き方を間違えると NameError や長い名前の打ち間違いが続く。

たとえ(コードより先)

本棚から本を借りる。

  • import calendar=本を一冊まるごと借り、読むとき「calendar の ○○」と言う。
  • from calendar import month=必要な章だけコピーして、month と短く呼ぶ。
  • as cal=借りた本に「cal」という付箋名を付ける。

最小玩具例(長い実装禁止)

import calendar
calendar.month(2026, 7)

import calendar as cal
cal.month(2026, 7)

from calendar import month, isleap
month(2026, 7)
isleap(2024)   # → True
書き方効果
import 名名.関数 で使う
import 名 as 別名別名.関数
from 名 import 部品部品 を直接呼ぶ

組み込み(例: print)は import 不要。標準モジュールは import が必要——この差が試験のひっかけになりやすい。

仕組み(言葉)

import はモジュールの名前空間を今のファイルに結びつける。from はそこから特定の名前だけを今の名前表に取り込む。as は結びつけた名前のラベルを短くするだけ。

よくある誤解(音読一発短文)

  • なぜ起きるか: from math import sqrt のあと、つい math.sqrt と書いてしまう(またはその逆)。
  • NG例: from math import sqrt なのに math.sqrt(9) で呼ぶ。
  • 正しい見方: 取り込んだ書き方に合わせて呼ぶfrom なら sqrt(9)import math なら math.sqrt(9)
  • ※補足(任意1行): abs は組み込み、math.fabs はモジュール側(第10回の対比)。

試験答え方

  1. 完成文: 「import でモジュールを読み、from で部品を取り、as で別名を付ける。」
  2. 骨組み/表: 3書き方と呼び出し形の対応表。
  3. 採点語: import/from/as/モジュール名.関数名。

標準ライブラリと外部ライブラリとは、

一言(日常語)

標準は Python を入れたときに最初から付いてくる道具(ただしモジュールは import が必要)。外部は別途インストールするもの(例: Pillow)。どちらも使い始めは import

なぜ必要か(試験メタだけ禁止)

乱数や数学は標準で足りることが多い。画像処理(Pillow)のように、標準に無い道具は pip install してから使う。区別できないと「なぜエラー?」の切り分けができない。

たとえ(コードより先)

スマホの初期アプリ=標準。アプリストアから追加したアプリ=外部。どちらも「開いて使う」必要があるが、後者は先にダウンロード(インストール)がいる。

最小玩具例(長い実装禁止)

標準(import のみ):

import random
print(random.randint(1, 6))

外部(インストール後):

from PIL import Image
img = Image.open("hana.jpg")
img.show()
標準ライブラリ外部ライブラリ
入手Python 同梱pip install など
使用importインストール後に import
random, math, tkinterPillow(PIL

※ Pillow はパッケージ名と import 名(PIL)が違う点に注意。

仕組み(言葉)

標準モジュールは環境にあらかじめある。外部は PyPI などから入れ、そのあと標準と同じく import して関数/クラスを使う。画像なら open でオブジェクトを得て、show や属性(height 等)で操作する。

よくある誤解(音読一発短文)

  • なぜ起きるか: 「標準=import 不要」と思い込む(組み込み関数と混同)。
  • NG例: random.randint を import なしで使う。
  • 正しい見方: 組み込み関数print, abs 等)だけが import 不要。標準モジュールは import 必要。
  • ※補足(任意1行): 長い画像加工チェーンはドリル/宿題側。概念では open→show まで。

試験答え方

  1. 完成文: 「標準は最初から付く(import は要)。外部はインストール後に import して使う。」
  2. 骨組み/表: 標準 vs 外部 vs 組み込みの3列。
  3. 採点語: 標準ライブラリ/外部ライブラリ/pip/import。

§C ライブラリ — 手で解く入口

なぜ今この演習か: 概念を言葉で押さえたあと、宿題同型を途中式(完成コード)で一度通すため。

求めるもの: 対応ドリルの worked を写経せず理解しながら追えること
使う定義: 上の本編セクションの用語
  1. 与件を音読する
  2. 答案型(クラス/import/部品)を紙に書く
  3. worked の各行の「なぜ」を口で言えるか確認する
  4. fade → solo へ進む(別 surface)
詳細な完成コードはコーディングドリル(MD drills)へ

答案文: 「概念は入門・本編、長い実装はドリルで書く」

部分点: 用語の完成文/ドリルの採点語

考察: コード科目では L3 の手数の本体がドリルの worked にある。ここでは飛ばさずハブとして接続する。

§D tkinter

入門カードと同じ正本を、章として通読できるように再掲(薄くしていない)。

tkinter(てぃーきんたー)とは、

一言(日常語)

Python 標準の GUI(画面付きアプリ)用ツールキット。窓(ウィンドウ)の上にボタンやラベルなどの部品(ウィジェット)を置いて、クリックなどの操作に処理をつなぐ。

なぜ必要か(試験メタだけ禁止)

期末本線ではチェック/ラジオ/キャンバスなど「画面を作って動かす」問題が出る想定。コンソールの print だけでは足りない。窓の作り方と部品の置き方の型を持っておく必要がある。

たとえ(コードより先)

紙の工作キット。土台の厚紙がメインウィンドウ、シールがボタンやラベル。シールを貼る=pack などで配置。押したら動く仕組みを紐づける=command

最小玩具例(長い実装禁止)

import tkinter as tk
base = tk.Tk()
btn = tk.Button(base, text="PUSH!!")
btn.pack()
base.mainloop()   # 画面を出し続ける

前後比較(コード無し):

部品を作っただけまだ画面に並ばない
pack(など)で配置見える位置に並ぶ
mainloop窓が開いたまま操作を待ち続ける

仕組み(言葉)

  1. Tk で土台の窓を作る。
  2. ButtonLabel など部品クラスでウィジェットを作る(親は土台)。
  3. pack 等で並べる。
  4. 必要なら command で関数を結びつける。
  5. mainloop で表示を維持する。

長い画面(飲料UI・攻撃ボタン一式)はドリル側。

よくある誤解(音読一発短文)

  • なぜ起きるか: 部品を生成した瞬間に画面に出ると思いがち。
  • NG例: Button(...) だけで packmainloop も書かない。
  • 正しい見方: 作る・置く・回すの3段。置かないと見えない。回さないと一瞬で終わる/固まる。
  • ※補足(任意1行): side / anchor は配置の微調整(第12回)。

試験答え方

  1. 完成文: 「tkinter は GUI 用の標準ライブラリで、窓にウィジェットを置いて操作する。」
  2. 骨組み/表: Tk → 部品生成 → pack →(command)→ mainloop。
  3. 採点語: tkinter/ウィジェット/pack/mainloop。

ウィジェット変数(StringVar / BooleanVar / IntVar)とは、

一言(日常語)

画面の部品(入力欄・チェック・ラジオ)と連動する専用の変数オブジェクト。部品の状態が変わると値が変わり、get / set で読み書きする。

なぜ必要か(試験メタだけ禁止)

普通の Python 変数だけだと、チェックのオンオフや入力文字を部品から取り出しにくい。ウィジェット変数をはさむと、「今チェックされているか」「今選ばれている value」を試験で聞かれても答えられる。

たとえ(コードより先)

スイッチとランプをつなぐ電線。スイッチ(チェックボタン)を倒すと、電線の先の状態表示(変数)が True/False に変わる。ランプを直接いじるのではなく、電線(変数)を見る。

※「連動/見える」の基準点=そのウィジェット変数を variable / textvariable で結びつけた部品から見た状態。

最小玩具例(長い実装禁止)

import tkinter as tk
base = tk.Tk()
bln = tk.BooleanVar()
bln.set(True)                    # 初期オン
cb = tk.Checkbutton(base, text="ON", variable=bln)
cb.pack()
# あとで: bln.get() → True/False
クラス向き
StringVar文字列(Entry / Label の textvariable)
BooleanVarTrue/False(Checkbutton)
IntVar整数(Radiobutton の value と一致させる)

仕組み(言葉)

部品に variable=textvariable= でウィジェット変数を渡す。ユーザー操作で部品が変わると変数側も更新される。プログラムから set すれば初期表示も変えられる。状態の取得は get

よくある誤解(音読一発短文)

  • なぜ起きるか: 普通の x = True とウィジェット変数を同一視する。
  • NG例: Checkbutton に普通の bool を渡して状態を取ろうとする。
  • 正しい見方: BooleanVar 等のインスタンスを渡し、get/set で扱う。
  • ※補足(任意1行): ラジオは IntVar の値と各ボタンの value が一致したとき選ばれる。

試験答え方

  1. 完成文: 「ウィジェット変数は部品と連動する変数で、get/set で状態を扱う。」
  2. 骨組み/表: 種類(String/Boolean/Int)と典型ウィジェットの対応。
  3. 採点語: StringVar/BooleanVar/IntVar/get/set/variable。

チェックボタンとラジオボタンとは、

一言(日常語)

どちらも「選ぶ」ための GUI 部品。チェックはグループ内で複数オンにできる。ラジオはグループ内でどれか1つだけ選ぶ。

なぜ必要か(試験メタだけ禁止)

飲料を複数注文したいならチェック、ランチセットを1つだけ選ぶならラジオ、と用途が違う。変数の型も違う(BooleanVar の並び vs IntVar+value)。取り違えると UI 仕様が宿題と食い違う。

たとえ(コードより先)

学食の伝票。トッピングをいくつでも付ける=チェック。日替わりA/B/Cはどれか一つ=ラジオ(昔のラジオの押しボタンは1つ押すと他が戻る)。

最小玩具例(長い実装禁止)

チェック(複数可):

# bln1, bln2 はそれぞれ BooleanVar
# Checkbutton(..., variable=bln1)
# Checkbutton(..., variable=bln2)
# 両方 True になり得る

ラジオ(1つだけ):

# v = IntVar(); v.set(1)
# Radiobutton(..., variable=v, value=1)
# Radiobutton(..., variable=v, value=2)
# 選ばれているのは v.get() と一致する value の1つ
チェックボタンラジオボタン
同時選択複数可グループ内1つ
典型変数BooleanVar(部品ごと)IntVar(グループで共有)
状態の見方get() が True/False共有変数の get() が value

仕組み(言葉)

チェックは部品ごとにオンオフの枠を持つ。ラジオはグループで1つの IntVar を共有し、各ボタンに違う value を付ける。ユーザーが押すと変数がその value に変わり、一致するボタンだけが選択表示になる。

よくある誤解(音読一発短文)

  • なぜ起きるか: 「選ぶ部品」として同じ棚に並んで見える。
  • NG例: ランチ3択に Checkbutton を3つ付けて「1つだけ選ばせる」つもりになる。
  • 正しい見方: 1つだけならラジオ+共有 IntVar。複数可ならチェック+BooleanVar 複数。
  • ※補足(任意1行): for+辞書で部品生成を短くするのはドリル(D06/D07)。

試験答え方

  1. 完成文: 「チェックは複数選択可、ラジオはグループ内で単一選択。」
  2. 骨組み/表: 上表+変数の取り方(get)。
  3. 採点語: Checkbutton/Radiobutton/BooleanVar/IntVar/value。

§D tkinter — 手で解く入口

なぜ今この演習か: 概念を言葉で押さえたあと、宿題同型を途中式(完成コード)で一度通すため。

求めるもの: 対応ドリルの worked を写経せず理解しながら追えること
使う定義: 上の本編セクションの用語
  1. 与件を音読する
  2. 答案型(クラス/import/部品)を紙に書く
  3. worked の各行の「なぜ」を口で言えるか確認する
  4. fade → solo へ進む(別 surface)
詳細な完成コードはコーディングドリル(MD drills)へ

答案文: 「概念は入門・本編、長い実装はドリルで書く」

部分点: 用語の完成文/ドリルの採点語

考察: コード科目では L3 の手数の本体がドリルの worked にある。ここでは飛ばさずハブとして接続する。

§E Canvas

入門カードと同じ正本を、章として通読できるように再掲(薄くしていない)。

Canvas(きゃんばす)と move / coords とは、

一言(日常語)

Canvas は、線・円・画像・文字を載せる絵を描く台move は今の位置から相対的にずらす。coords は中心座標を絶対指定で置き直す。

なぜ必要か(試験メタだけ禁止)

キャラ画像を出したり、攻撃ボタンで相手方向へ動かしたりする宿題の土台。相対移動と絶対移動を混同すると「一回動いたら変な場所に飛ぶ」になる。

たとえ(コードより先)

黒板にマグネットを貼る台=Canvas。

  • move: 「今の場所から右へ10、下へ50」とずらす(相対)。
  • coords: 「中心を (200, 300) に置き直す」(絶対)。

※「見える」の基準点=メインウィンドウ上の Canvas 座標系(左上がだいたい (0,0)、右が +x、下が +y)。画像は指定座標が中心になることが多い。

最小玩具例(長い実装禁止)

# canv は Canvas のインスタンス、タグ "hero" の画像があるとする
canv.move("hero", 10, 50)       # 相対: 右10・下50
canv.coords("hero", 200, 300)   # 絶対: 中心を (200,300)
canv.update()                   # 今の設定で画面を更新
メソッド意味
move(タグ, dx, dy)相対移動
coords(タグ, x, y)絶対座標(中心)
update表示を現状に合わせる

長い攻撃ループや点滅はドリル D08。概念では3語の差だけでよい。

仕組み(言葉)

create_image などで図形にタグを付ける。あとからタグを指定して動かす。move は差分、coords は行き先の座標そのもの。アニメっぽく見せるときは少し動かして update する、という流れ(詳細は追加PDF・ドリル)。

よくある誤解(音読一発短文)

  • なぜ起きるか: どちらも「画像が動く」ので同じに見える。
  • NG例: 「相手の座標へ行きたい」のに毎回 move だけで済ませようとして位置が積み上がる/足りない。
  • 正しい見方: ずらすなら move、位置を決め打ちするなら coords。目的で選ぶ。
  • ※補足(任意1行): tkinter は png 向き。jpg は非対応、と講義で注意あり。

試験答え方

  1. 完成文: 「Canvas は図形・画像の台。move は相対、coords は絶対位置。」
  2. 骨組み/表: move / coords / update の役割表。
  3. 採点語: Canvas/create_image/move/coords/update/タグ。

§E Canvas — 手で解く入口

なぜ今この演習か: 概念を言葉で押さえたあと、宿題同型を途中式(完成コード)で一度通すため。

求めるもの: 対応ドリルの worked を写経せず理解しながら追えること
使う定義: 上の本編セクションの用語
  1. 与件を音読する
  2. 答案型(クラス/import/部品)を紙に書く
  3. worked の各行の「なぜ」を口で言えるか確認する
  4. fade → solo へ進む(別 surface)
詳細な完成コードはコーディングドリル(MD drills)へ

答案文: 「概念は入門・本編、長い実装はドリルで書く」

部分点: 用語の完成文/ドリルの採点語

考察: コード科目では L3 の手数の本体がドリルの worked にある。ここでは飛ばさずハブとして接続する。

§F 継承と super

入門カードと同じ正本を、章として通読できるように再掲(薄くしていない)。

継承と super とは、

一言(日常語)

継承は、親クラスの仕組みを子が引き継ぐこと。super() は、子の中から親の同名処理(よくあるのはコンストラクタや display)を呼び出す窓口

なぜ必要か(試験メタだけ禁止)

本・雑誌・漫画で「タイトルと値段」は共通、「発行月」「巻」は違う。共通を親に置き、子は差分だけ足す。共通表示を親の display に任せると、宿題の Book 系が書ける。

たとえ(コードより先)

名前と住所は家族共通の台帳(親)。自分の趣味欄だけ子が足す。台帳の共通欄を書くときは「親の書き方を呼ぶ」=super()。全部を子がゼロから書き直す必要はない。

最小玩具例(長い実装禁止)

class Book:
    def __init__(self, name, price):
        self.name = name
    def display(self):
        print(self.name)

class Comic(Book):
    def __init__(self, name, price, vol):
        super().__init__(name, price)
        self.vol = vol

display の差分呼び出しと Magazine 全文はドリル D10。)

手順子がやること
コンストラクタsuper().__init__(…) で共通引数を親へ
displaysuper().display() のあと差分を表示
呼び出し同じ display 名でポリモーフィズム

Magazine/Comic の全文と指定インスタンスはドリル D10。

仕組み(言葉)

子クラスの定義に親を書く(class Comic(Book):)。子の __init__ で親の初期化を呼ばないと、親が持つべき属性が揃わないことがある。display をオーバーライドしつつ super().display() で共通出力を再利用する、というのが第14回の型。

よくある誤解(音読一発短文)

  • なぜ起きるか: 「継承した=親のコンストラクタも自動」と思い込む。
  • NG例: 子の __init__self.name だけ足し、super().__init__ を忘れる。
  • 正しい見方: 共通の初期化は super().__init__ で親に渡す(講義の指示どおり)。
  • ※補足(任意1行): ポリモーフィズムで同じ関数から display を呼ぶのは D10。

試験答え方

  1. 完成文: 「継承で親を引き継ぎ、super で親の処理を子から呼ぶ。」
  2. 骨組み/表: __init__display それぞれで super を使う順。
  3. 採点語: 継承/親クラス/子クラス/super/オーバーライド。

§F 継承と super — 手で解く入口

なぜ今この演習か: 概念を言葉で押さえたあと、宿題同型を途中式(完成コード)で一度通すため。

求めるもの: 対応ドリルの worked を写経せず理解しながら追えること
使う定義: 上の本編セクションの用語
  1. 与件を音読する
  2. 答案型(クラス/import/部品)を紙に書く
  3. worked の各行の「なぜ」を口で言えるか確認する
  4. fade → solo へ進む(別 surface)
詳細な完成コードはコーディングドリル(MD drills)へ

答案文: 「概念は入門・本編、長い実装はドリルで書く」

部分点: 用語の完成文/ドリルの採点語

考察: コード科目では L3 の手数の本体がドリルの worked にある。ここでは飛ばさずハブとして接続する。

手書きドリル(worked → faded → solo)

①完成例(worked)は下の各ドリルと本編 L3。②フェード(faded)は穴埋め。③自力(solo)は白紙でノートに書く。L3 と同数値・同文言のコピペ禁止(L4 は別 surface)。

正本: runs/ool-final/content/drills/*.mdドリル一覧へ

手で書くドリル一覧

正本は runs/ool-final/content/drills/*.md。各テーマ: 与件→求めよ→worked→fade→solo。

IDテーマリンク
D01Circle/Square開く
D02Animal開く
D03サイコロ開く
D04time.sleep開く
D04bPillow開く
D05mondai開く
D06Checkbutton開く
D07Radiobutton開く
D08攻撃 Canvas開く
D09おみくじ開く
D10Book 系開く
回し方 ①答案型 → ②worked写経 → ③fade → ④solo手書き。概念カードの長いコードは置かない。

GameCharacter(攻撃ドリルへ)

クラス定義と Canvas 攻撃は ドリル⑧ に統合(MD: D08)。

ドリル① CircleArea / SquareArea

資料準拠: 第9回 練習問題1(OOL_6月16日)

問題文
  1. CircleArea: コンストラクタ引数 r(半径)。area メソッドで円面積 cc を返す。
  2. SquareArea: コンストラクタ引数 a(一辺)。area メソッドで正方形面積 ss を返す。
  3. どちらも cal_area 関数から area を呼べるようにする(引数は自由)。

上記3クラス/関数を実装し、円・正方形それぞれで cal_area 経由の面積が得られること。

答案型

この問題の答案型(骨格)

class CircleArea:
    def __init__(self, r):
    def area(self):
class SquareArea:
    def __init__(self, a):
    def area(self):
def cal_area(obj):
① worked — 完成コード+解説
class CircleArea:
    def __init__(self, r):
        self.r = r
    def area(self):
        cc = 3.14 * self.r * self.r
        return cc

class SquareArea:
    def __init__(self, a):
        self.a = a
    def area(self):
        ss = self.a * self.a
        return ss

def cal_area(obj):
    return obj.area()

print(cal_area(CircleArea(2)))
print(cal_area(SquareArea(3)))

  1. 求めるもの: 同名 area を持つ2クラス+共通呼び出し関数。
  2. 使う考え方: ポリモーフィズム(同じメソッド名)。面積式は円 3.14*r*r(講義例に合わせる)、正方形 a*a
  3. 手順:
  • CircleArea を定義し __init__self.rarea で計算して返す。
  • SquareArea 同様に self.a
  • def cal_area(obj): return obj.area()
  • インスタンスを渡し結果を確認。

② faded — 穴埋め(手で埋めてから開く)
class CircleArea:
    def __init__(self, r):
        # TODO: self.r
        pass
    def area(self):
        # TODO: cc を return
        pass

class SquareArea:
    def __init__(self, a):
        self.a = a
    def area(self):
        return self.a * self.a

def cal_area(obj):
    return obj.area()

ヒント: `cal_area` と `SquareArea` は埋まっている。`CircleArea` の `__init__` と `area` だけ書け。

穴埋め解答
class CircleArea:
    def __init__(self, r):
        self.r = r
    def area(self):
        cc = 3.14 * self.r * self.r
        return cc

class SquareArea:
    def __init__(self, a):
        self.a = a
    def area(self):
        ss = self.a * self.a
        return ss

def cal_area(obj):
    return obj.area()

print(cal_area(CircleArea(2)))
print(cal_area(SquareArea(3)))
③ solo — 白紙で書く

与件どおり白紙で書け。円 r=5、正方形 a=4cal_area の結果を示せ。

solo 解答例(書いたあと照合)
class CircleArea:
    def __init__(self, r):
        self.r = r
    def area(self):
        cc = 3.14 * self.r * self.r
        return cc

class SquareArea:
    def __init__(self, a):
        self.a = a
    def area(self):
        ss = self.a * self.a
        return ss

def cal_area(obj):
    return obj.area()

print(cal_area(CircleArea(2)))
print(cal_area(SquareArea(3)))
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • クラス名・コンストラクタ引数
  • `area` 同名
  • `cal_area` が `obj.area()`
  • 面積式の正しさ

ドリル② Animal / Dog / Snake

資料準拠: 第9回 演習問題1(OOL_6月16日)※第10回冒頭にも再掲

問題文
  1. Animal: cry"鳴く" を返す。
  2. Dog: cry"わんわん"
  3. Snake: cry"シャー"
  4. 各子の cry をポリモーフィズムの考えで実行する。

継承+オーバーライド+共通関数(または同名呼び出し)で、Dog/Snake の鳴き声を得ること。

答案型

この問題の答案型(骨格)

class Animal:
    def cry(self):
class Dog(Animal):
    def cry(self):
class Snake(Animal):
    def cry(self):
def play(animal):
① worked — 完成コード+解説
class Animal:
    def cry(self):
        return "鳴く"

class Dog(Animal):
    def cry(self):
        return "わんわん"

class Snake(Animal):
    def cry(self):
        return "シャー"

def play(animal):
    return animal.cry()

print(play(Dog()))
print(play(Snake()))

  1. 求めるもの: 親1・子2・共通呼び出し。
  2. 使う考え方: オーバーライド+ポリモーフィズム。
  3. 手順: 親定義 → 子で同名上書き → def play(a): return a.cry() → Dog/Snake を渡す。

② faded — 穴埋め(手で埋めてから開く)
class Animal:
    def cry(self):
        return "鳴く"
class Dog(Animal):
    def cry(self):
        return "わんわん"
class Snake(Animal):
    def cry(self):
        pass  # TODO
def play(animal):
    pass  # TODO

ヒント: 親と Dog は完成。Snake の `cry` と `play` の中身だけ埋めよ。

穴埋め解答
class Animal:
    def cry(self):
        return "鳴く"

class Dog(Animal):
    def cry(self):
        return "わんわん"

class Snake(Animal):
    def cry(self):
        return "シャー"

def play(animal):
    return animal.cry()

print(play(Dog()))
print(play(Snake()))
③ solo — 白紙で書く

与件どおり白紙実装。play(Dog())play(Snake()) の表示結果を書け。

solo 解答例(書いたあと照合)
class Animal:
    def cry(self):
        return "鳴く"

class Dog(Animal):
    def cry(self):
        return "わんわん"

class Snake(Animal):
    def cry(self):
        return "シャー"

def play(animal):
    return animal.cry()

print(play(Dog()))
print(play(Snake()))
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • `class Dog(Animal)` の継承表記
  • `cry` オーバーライド
  • 共通関数から呼び出し
  • 戻り値文字列が指定どおり

ドリル③ 2サイコロ + 絶対値

資料準拠: 第9回 演習問題2(OOL_6月16日)

問題文
  • random で 1〜6 の整数を2つ(di1, di2)。
  • 一致なら「同じ数」と表示。
  • 違えば差の絶対値を表示。絶対値には math モジュールを使うこと。

上記仕様の短プログラム。

答案型

この問題の答案型(骨格)

import random
import math
① worked — 完成コード+解説
import random
import math

di1 = random.randint(1, 6)
di2 = random.randint(1, 6)
print(di1, di2)
if di1 == di2:
    print("同じ数")
else:
    print(math.fabs(di1 - di2))

  1. 求めるもの: 乱数2つと比較表示。
  2. 使う式: random.randint(1,6)math.fabs(di1-di2)(講義指定)。
  3. 手順: import → 2乱数 → if 一致 else 差。

② faded — 穴埋め(手で埋めてから開く)
import random
import math
di1 = random.randint(1, 6)
di2 = random.randint(1, 6)
# TODO: 一致/差

ヒント: 乱数取得まで埋まっている。比較と表示だけ書け。

穴埋め解答
import random
import math

di1 = random.randint(1, 6)
di2 = random.randint(1, 6)
print(di1, di2)
if di1 == di2:
    print("同じ数")
else:
    print(math.fabs(di1 - di2))
③ solo — 白紙で書く

白紙。実行例として「同じ数」になる場合と差が出る場合の表示イメージを1つずつ書け。

solo 解答例(書いたあと照合)
import random
import math

di1 = random.randint(1, 6)
di2 = random.randint(1, 6)
print(di1, di2)
if di1 == di2:
    print("同じ数")
else:
    print(math.fabs(di1 - di2))
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • `import random` / `import math`
  • `randint(1,6)` が2つ
  • 分岐メッセージ
  • `math.fabs`

ドリル④ time.sleep 時刻差

資料準拠: 第10回 練習問題1(OOL_6月23日)

問題文
  • time モジュールを使う。
  • time.sleep(秒数) で 3 秒待機。
  • sleep の前後で時刻を取得し、時間差を表示する。

待機前後の time.time() の差が約3になるプログラム。

答案型

この問題の答案型(骨格)

import time
① worked — 完成コード+解説
import time
t0 = time.time()
time.sleep(3)
t1 = time.time()
print(t1 - t0)

  1. 求めるもの: 開始時刻・sleep・終了時刻・差。
  2. 使う関数: time.time(), time.sleep(3)
  3. 手順: import → t0 → sleep → t1 → print(t1-t0)。

② faded — 穴埋め(手で埋めてから開く)
import time
# TODO: t0
time.sleep(3)
# TODO: t1 と差

ヒント: `sleep(3)` は既にある。`t0`/`t1` の取得と差の表示だけ書け。

穴埋め解答
import time
t0 = time.time()
time.sleep(3)
t1 = time.time()
print(t1 - t0)
③ solo — 白紙で書く

白紙で書け。差がおおよそ 3 前後になる理由を一文で添えよ。

solo 解答例(書いたあと照合)
import time
t0 = time.time()
time.sleep(3)
t1 = time.time()
print(t1 - t0)
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • `import time`
  • sleep 前後で `time.time()`
  • 差の表示

ドリル④b Pillow open/show

資料準拠: 第10回(OOL_6月23日)Pillow 導入部

問題文
  • from PIL import Image
  • 同じフォルダの画像(例: hana.jpg)を Image.open で開き show する
  • height(または size)など属性を1つ表示する

※ 長い回転・合成チェーンは本ドリルの必須外(概念は玩具、詳細は宿題ノート)。

open → show → 属性表示の最小3行+import。

答案型

この問題の答案型(骨格)

1. 求めるもの: 画像オブジェクトを得て表示し、属性を読む。  
2. 使うもの: `PIL.Image`。  
3. 手順: import → open → show → print 属性。
from PIL import Image
img = Image.open("hana.jpg")
img.show()
print(img.height)
① worked — 完成コード+解説
from PIL import Image
img = Image.open("hana.jpg")
img.show()
print(img.height)

  1. 求めるもの: 画像オブジェクトを得て表示し、属性を読む。
  2. 使うもの: PIL.Image
  3. 手順: import → open → show → print 属性。

② faded — 穴埋め(手で埋めてから開く)
from PIL import Image
img = Image.open("hana.jpg")
# TODO

ヒント: `open` まで埋まっている。`show` と属性表示だけ書け。

穴埋め解答
from PIL import Image
img = Image.open("hana.jpg")
img.show()
print(img.height)
③ solo — 白紙で書く

白紙。Pillow が外部ライブラリである理由(pip)を一文添えよ。

solo 解答例(書いたあと照合)
from PIL import Image
img = Image.open("hana.jpg")
img.show()
print(img.height)
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • `from PIL import Image`
  • `open` / `show`
  • 属性参照

ドリル⑤ mondai ×10 計測

資料準拠: 第10回 演習問題(OOL_6月23日)/第12回冒頭再掲

問題文
  • 1〜10 の乱数2つの足し算を表示する mondai 関数を作る。
  • 解答入力できるようにする。
  • それを 10回 繰り返し、かかった時間を計測する。

mondai 関数+10回ループ+開始/終了時刻。

答案型

この問題の答案型(骨格)

import random
import time
def mondai():
① worked — 完成コード+解説
import random
import time

def mondai():
    n1 = random.randint(1, 10)
    n2 = random.randint(1, 10)
    ans = int(input(f"{n1}+{n2}= "))
    if ans == n1 + n2:
        print("正解です")
    else:
        print("不正解です")

t0 = time.time()
for _ in range(10):
    mondai()
t1 = time.time()
print("かかった時間:", t1 - t0)

  1. 求めるもの: 関数化された出題+10回+時間。
  2. 使うもの: random.randint, input, time.time
  3. 手順: mondai 定義 → t0 → for 10回 mondai → t1 → 差。

② faded — 穴埋め(手で埋めてから開く)
import random
import time

def mondai():
    n1 = random.randint(1, 10)
    n2 = random.randint(1, 10)
    ans = int(input(f"{n1}+{n2}= "))
    print("正解です" if ans == n1 + n2 else "不正解です")

# TODO: 計測つきで10回

ヒント: `mondai` の中身は埋まっている。10回ループと時間計測だけ書け。

穴埋め解答
import random
import time

def mondai():
    n1 = random.randint(1, 10)
    n2 = random.randint(1, 10)
    ans = int(input(f"{n1}+{n2}= "))
    if ans == n1 + n2:
        print("正解です")
    else:
        print("不正解です")

t0 = time.time()
for _ in range(10):
    mondai()
t1 = time.time()
print("かかった時間:", t1 - t0)
③ solo — 白紙で書く

白紙。関数化せずに10回コピペしたコードとの違い(なぜ関数か)を一文で書け。

solo 解答例(書いたあと照合)
import random
import time

def mondai():
    n1 = random.randint(1, 10)
    n2 = random.randint(1, 10)
    ans = int(input(f"{n1}+{n2}= "))
    if ans == n1 + n2:
        print("正解です")
    else:
        print("不正解です")

t0 = time.time()
for _ in range(10):
    mondai()
t1 = time.time()
print("かかった時間:", t1 - t0)
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • `mondai` 関数
  • `randint(1,10)`×2
  • 正誤表示
  • 10回と `time.time`

ドリル⑥ Checkbutton 飲料

資料準拠: 第12回 練習問題1・2(OOL_6月30日)

問題文
  • チェックボタンで コーヒー/お茶/ジュース を選択可能。
  • ボタン押下で、選択した商品名を画面に表示。
  • 練習2: 同じ処理の繰り返しを for+辞書で書き直す。

BooleanVar×3(または for 生成)+表示用 Label/ボタン。

答案型

この問題の答案型(骨格)

import tkinter as tk
def show():
① worked — 完成コード+解説
import tkinter as tk

base = tk.Tk()
drink = {0: "コーヒー", 1: "お茶", 2: "ジュース"}
vars_ = []
for i in range(len(drink)):
    v = tk.BooleanVar()
    vars_.append(v)
    tk.Checkbutton(base, text=drink[i], variable=v).pack(anchor=tk.W)

msg = tk.StringVar(value="")
tk.Label(base, textvariable=msg).pack()

def show():
    picked = [drink[i] for i in range(len(drink)) if vars_[i].get()]
    msg.set(", ".join(picked) if picked else "(未選択)")

tk.Button(base, text="決定", command=show).pack()
base.mainloop()

  1. 求めるもの: 複数選択可能な飲料 UI。
  2. 使うもの: BooleanVar, Checkbutton, Button, Label, 辞書+for。
  3. 手順: 土台 → 辞書でラベル定義 → for で Checkbutton → 確定ボタンで get して表示。

② faded — 穴埋め(手で埋めてから開く)
# drink, vars_ は生成済みとする
def show():
    pass  # TODO: get して msg.set

ヒント: 辞書と Checkbutton の for は埋まっている。`show` だけ書け。

穴埋め解答
import tkinter as tk

base = tk.Tk()
drink = {0: "コーヒー", 1: "お茶", 2: "ジュース"}
vars_ = []
for i in range(len(drink)):
    v = tk.BooleanVar()
    vars_.append(v)
    tk.Checkbutton(base, text=drink[i], variable=v).pack(anchor=tk.W)

msg = tk.StringVar(value="")
tk.Label(base, textvariable=msg).pack()

def show():
    picked = [drink[i] for i in range(len(drink)) if vars_[i].get()]
    msg.set(", ".join(picked) if picked else "(未選択)")

tk.Button(base, text="決定", command=show).pack()
base.mainloop()
③ solo — 白紙で書く

練習1(手書き3回)版を先に書き、練習2(for)版にリファクタせよ。

solo 解答例(書いたあと照合)
import tkinter as tk

base = tk.Tk()
drink = {0: "コーヒー", 1: "お茶", 2: "ジュース"}
vars_ = []
for i in range(len(drink)):
    v = tk.BooleanVar()
    vars_.append(v)
    tk.Checkbutton(base, text=drink[i], variable=v).pack(anchor=tk.W)

msg = tk.StringVar(value="")
tk.Label(base, textvariable=msg).pack()

def show():
    picked = [drink[i] for i in range(len(drink)) if vars_[i].get()]
    msg.set(", ".join(picked) if picked else "(未選択)")

tk.Button(base, text="決定", command=show).pack()
base.mainloop()
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • Checkbutton×飲料
  • BooleanVar
  • 決定ボタンで選択名表示
  • for+辞書(練習2)

ドリル⑦ Radiobutton ランチ

資料準拠: 第12回 演習問題(OOL_6月30日)/第13回冒頭再掲

問題文
  • ラジオボタンを Aランチ/Bランチ/Cランチ の3つに。
  • 同じような生成を3回書かず for を使う。

IntVar 共有+value 付き Radiobutton を for で生成。選択値の表示ができればなおよい。

答案型

この問題の答案型(骨格)

import tkinter as tk
def show():
① worked — 完成コード+解説
import tkinter as tk

base = tk.Tk()
menu = {0: "Aランチ", 1: "Bランチ", 2: "Cランチ"}
v = tk.IntVar(value=0)
for i in range(len(menu)):
    tk.Radiobutton(base, text=menu[i], variable=v, value=i).pack(anchor=tk.W)

msg = tk.StringVar()
tk.Label(base, textvariable=msg).pack()

def show():
    msg.set(menu[v.get()])

tk.Button(base, text="決定", command=show).pack()
base.mainloop()

  1. 求めるもの: 単一選択ランチ UI。
  2. 使うもの: IntVar, Radiobutton, 辞書/リスト+for。
  3. 手順: IntVar 初期値 → for で radio → get で表示。

② faded — 穴埋め(手で埋めてから開く)
# TODO from Fade section

ヒント: Radiobutton の for は完成。`show` と初期 `value` の意味をコメントで説明しつつ `show` を実装せよ。

穴埋め解答
import tkinter as tk

base = tk.Tk()
menu = {0: "Aランチ", 1: "Bランチ", 2: "Cランチ"}
v = tk.IntVar(value=0)
for i in range(len(menu)):
    tk.Radiobutton(base, text=menu[i], variable=v, value=i).pack(anchor=tk.W)

msg = tk.StringVar()
tk.Label(base, textvariable=msg).pack()

def show():
    msg.set(menu[v.get()])

tk.Button(base, text="決定", command=show).pack()
base.mainloop()
③ solo — 白紙で書く

白紙。チェックボタン版との違い(変数が1つか複数か)を答案に一文書け。

solo 解答例(書いたあと照合)
import tkinter as tk

base = tk.Tk()
menu = {0: "Aランチ", 1: "Bランチ", 2: "Cランチ"}
v = tk.IntVar(value=0)
for i in range(len(menu)):
    tk.Radiobutton(base, text=menu[i], variable=v, value=i).pack(anchor=tk.W)

msg = tk.StringVar()
tk.Label(base, textvariable=msg).pack()

def show():
    msg.set(menu[v.get()])

tk.Button(base, text="決定", command=show).pack()
base.mainloop()
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • Radiobutton
  • 共有 IntVar
  • value がユニーク
  • for で生成

ドリル⑧ GameCharacter + 攻撃

資料準拠: 第13回 練習1・演習(OOL_7月7日)+ OOL_7月7日追加.pdf/第14回冒頭

問題文
  1. GameCharacter クラス: コンストラクタでジョブとライフ。info でジョブとライフを表示。

例: 騎士 life=120、魔法使 life=80。

  1. Canvas にキャラ画像を表示(png)。
  2. 各キャラに「攻撃」ボタン。押した側の画像を相手方向へ移動(move 等。追加資料の流れ)。

途中まででも提出可、と講義にあるが、本ドリルは worked まで完成形を示す。

クラス+Canvas 配置+攻撃で相対移動する最小実装。

答案型

この問題の答案型(骨格)

import tkinter as tk
class GameCharacter:
    def __init__(self, job, life):
    def info(self):
def attack_left():
def attack_right():
① worked — 完成コード+解説
import tkinter as tk

class GameCharacter:
    def __init__(self, job, life):
        self.job = job
        self.life = life
    def info(self):
        print(self.job, self.life)

# --- GUI(画像ファイルは教材の png を同じフォルダに置く)---
base = tk.Tk()
canv = tk.Canvas(base, width=400, height=300)
canv.pack()

# 実際の試験/宿題では PhotoImage で png を読む
# img_l = tk.PhotoImage(file="knight.png")
# img_r = tk.PhotoImage(file="wizard.png")
# canv.create_image(100, 150, image=img_l, tags=("left",))
# canv.create_image(300, 150, image=img_r, tags=("right",))

def attack_left():
    # 左キャラを右方向へ寄せる(相対)
    for _ in range(10):
        canv.move("left", 8, 0)
        canv.update()

def attack_right():
    for _ in range(10):
        canv.move("right", -8, 0)
        canv.update()

tk.Button(base, text="左が攻撃", command=attack_left).pack(side=tk.LEFT)
tk.Button(base, text="右が攻撃", command=attack_right).pack(side=tk.LEFT)

c1 = GameCharacter("騎士", 120)
c2 = GameCharacter("魔法使", 80)
c1.info()
c2.info()
base.mainloop()

  1. 求めるもの: キャラ2体の表示と、ボタンで一方が寄る動き。
  2. 使うもの: クラス、Canvas.create_image、タグ、moveupdate
  3. 手順: クラス定義 → Tk/Canvas → 画像2枚にタグ → 攻撃関数で dx を相手向きに move。

※ 画像読み込み行は環境依存のためコメント例。手元ではコメントを外す。点滅ダメージは第14回の発展(任意)。

② faded — 穴埋め(手で埋めてから開く)
# TODO from Fade section

ヒント: `GameCharacter` と Canvas 配置は完成。`attack_left` だけ `move`+`update` で埋めよ。

穴埋め解答
import tkinter as tk

class GameCharacter:
    def __init__(self, job, life):
        self.job = job
        self.life = life
    def info(self):
        print(self.job, self.life)

# --- GUI(画像ファイルは教材の png を同じフォルダに置く)---
base = tk.Tk()
canv = tk.Canvas(base, width=400, height=300)
canv.pack()

# 実際の試験/宿題では PhotoImage で png を読む
# img_l = tk.PhotoImage(file="knight.png")
# img_r = tk.PhotoImage(file="wizard.png")
# canv.create_image(100, 150, image=img_l, tags=("left",))
# canv.create_image(300, 150, image=img_r, tags=("right",))

def attack_left():
    # 左キャラを右方向へ寄せる(相対)
    for _ in range(10):
        canv.move("left", 8, 0)
        canv.update()

def attack_right():
    for _ in range(10):
        canv.move("right", -8, 0)
        canv.update()

tk.Button(base, text="左が攻撃", command=attack_left).pack(side=tk.LEFT)
tk.Button(base, text="右が攻撃", command=attack_right).pack(side=tk.LEFT)

c1 = GameCharacter("騎士", 120)
c2 = GameCharacter("魔法使", 80)
c1.info()
c2.info()
base.mainloop()
③ solo — 白紙で書く

与件の表どおりインスタンスを作り info。続けて攻撃ボタン用の move ループを書け。

solo 解答例(書いたあと照合)
import tkinter as tk

class GameCharacter:
    def __init__(self, job, life):
        self.job = job
        self.life = life
    def info(self):
        print(self.job, self.life)

# --- GUI(画像ファイルは教材の png を同じフォルダに置く)---
base = tk.Tk()
canv = tk.Canvas(base, width=400, height=300)
canv.pack()

# 実際の試験/宿題では PhotoImage で png を読む
# img_l = tk.PhotoImage(file="knight.png")
# img_r = tk.PhotoImage(file="wizard.png")
# canv.create_image(100, 150, image=img_l, tags=("left",))
# canv.create_image(300, 150, image=img_r, tags=("right",))

def attack_left():
    # 左キャラを右方向へ寄せる(相対)
    for _ in range(10):
        canv.move("left", 8, 0)
        canv.update()

def attack_right():
    for _ in range(10):
        canv.move("right", -8, 0)
        canv.update()

tk.Button(base, text="左が攻撃", command=attack_left).pack(side=tk.LEFT)
tk.Button(base, text="右が攻撃", command=attack_right).pack(side=tk.LEFT)

c1 = GameCharacter("騎士", 120)
c2 = GameCharacter("魔法使", 80)
c1.info()
c2.info()
base.mainloop()
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • GameCharacter の引数・info
  • Canvas と create_image(または同等)
  • 攻撃側が相手方向へ move
  • update

ドリル⑨ おみくじ

資料準拠: 第14回 練習問題1(OOL_7月14日)

問題文
  • tkinter でおみくじアプリ。
  • Canvas に画像(あれば)/Label で結果表示。
  • ボタンでおみくじを引き、結果を更新(update や Label の text 変更)。

ボタン1つ+結果表示が変わる最小おみくじ。

答案型

この問題の答案型(骨格)

import tkinter as tk
import random
def draw():
① worked — 完成コード+解説
import tkinter as tk
import random

base = tk.Tk()
base.geometry("300x200")
results = ["大吉", "吉", "中吉", "小吉", "凶"]
msg = tk.StringVar(value="ボタンを押しておみくじ")
tk.Label(base, textvariable=msg, font=("", 16)).pack(pady=20)

def draw():
    msg.set(random.choice(results))
    base.update()

tk.Button(base, text="おみくじを引く", command=draw).pack()
base.mainloop()

  1. 求めるもの: 抽選して画面に出す。
  2. 使うもの: random.choice, Button, Label(または Canvas テキスト)。
  3. 手順: 結果リスト → ボタン command で choice → Label 更新。

② faded — 穴埋め(手で埋めてから開く)
# TODO from Fade section

ヒント: `results` と Button はある。`draw` の中だけ書け。

穴埋め解答
import tkinter as tk
import random

base = tk.Tk()
base.geometry("300x200")
results = ["大吉", "吉", "中吉", "小吉", "凶"]
msg = tk.StringVar(value="ボタンを押しておみくじ")
tk.Label(base, textvariable=msg, font=("", 16)).pack(pady=20)

def draw():
    msg.set(random.choice(results))
    base.update()

tk.Button(base, text="おみくじを引く", command=draw).pack()
base.mainloop()
③ solo — 白紙で書く

白紙。Label の text を直接書き換える書き方と StringVar の違いを一文。

solo 解答例(書いたあと照合)
import tkinter as tk
import random

base = tk.Tk()
base.geometry("300x200")
results = ["大吉", "吉", "中吉", "小吉", "凶"]
msg = tk.StringVar(value="ボタンを押しておみくじ")
tk.Label(base, textvariable=msg, font=("", 16)).pack(pady=20)

def draw():
    msg.set(random.choice(results))
    base.update()

tk.Button(base, text="おみくじを引く", command=draw).pack()
base.mainloop()
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • ボタンと command
  • 乱択
  • 画面上の結果更新

ドリル⑩ Book / Magazine / Comic

資料準拠: 第14回 練習問題2(OOL_7月14日)

問題文

2-1 Book(name, price) + display(タイトルと値段)。 2-2 Magazine(Book): 引数にキーワード・発行月。親コンストラクタ呼び出し。display は親を呼んだあと差分。 2-3 Comic(Book): キーワード・巻。同様。 2-4 インスタンス:

  • m1: 月刊釣り名人, 1000, 釣りスポット, 8月号
  • c1: 名探偵コナン, 500, 推理もの, 10巻

最後に同じ関数から display をポリモーフィズムで実行。

継承+super+共通関数からの display

答案型

この問題の答案型(骨格)

class Book:
    def __init__(self, name, price):
    def display(self):
class Magazine(Book):
    def __init__(self, name, price, keyword, month):
    def display(self):
class Comic(Book):
    def __init__(self, name, price, keyword, vol):
    def display(self):
def show(obj):
① worked — 完成コード+解説
class Book:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    def display(self):
        print(self.name, self.price)

class Magazine(Book):
    def __init__(self, name, price, keyword, month):
        super().__init__(name, price)
        self.keyword = keyword
        self.month = month
    def display(self):
        super().display()
        print(self.keyword, self.month)

class Comic(Book):
    def __init__(self, name, price, keyword, vol):
        super().__init__(name, price)
        self.keyword = keyword
        self.vol = vol
    def display(self):
        super().display()
        print(self.keyword, self.vol)

def show(obj):
    obj.display()

m1 = Magazine("月刊釣り名人", 1000, "釣りスポット", "8月号")
c1 = Comic("名探偵コナン", 500, "推理もの", "10巻")
show(m1)
show(c1)

  1. 求めるもの: 3クラス+2インスタンス+共通呼び出し。
  2. 使う考え方: 継承、super().__init__ / super().display()、ポリモーフィズム。
  3. 手順: Book → Magazine/Comic → インスタンス → def show(b): b.display()

② faded — 穴埋め(手で埋めてから開く)
# TODO from Fade section

ヒント: `Book` と `Magazine` は完成。`Comic` の `__init__` / `display` と `show` だけ書け。引数は与件どおり。

穴埋め解答
class Book:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    def display(self):
        print(self.name, self.price)

class Magazine(Book):
    def __init__(self, name, price, keyword, month):
        super().__init__(name, price)
        self.keyword = keyword
        self.month = month
    def display(self):
        super().display()
        print(self.keyword, self.month)

class Comic(Book):
    def __init__(self, name, price, keyword, vol):
        super().__init__(name, price)
        self.keyword = keyword
        self.vol = vol
    def display(self):
        super().display()
        print(self.keyword, self.vol)

def show(obj):
    obj.display()

m1 = Magazine("月刊釣り名人", 1000, "釣りスポット", "8月号")
c1 = Comic("名探偵コナン", 500, "推理もの", "10巻")
show(m1)
show(c1)
③ solo — 白紙で書く

与件の m1/c1 を白紙実装。答案に「親の display を呼ぶ理由」を一文。

solo 解答例(書いたあと照合)
class Book:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    def display(self):
        print(self.name, self.price)

class Magazine(Book):
    def __init__(self, name, price, keyword, month):
        super().__init__(name, price)
        self.keyword = keyword
        self.month = month
    def display(self):
        super().display()
        print(self.keyword, self.month)

class Comic(Book):
    def __init__(self, name, price, keyword, vol):
        super().__init__(name, price)
        self.keyword = keyword
        self.vol = vol
    def display(self):
        super().display()
        print(self.keyword, self.vol)

def show(obj):
    obj.display()

m1 = Magazine("月刊釣り名人", 1000, "釣りスポット", "8月号")
c1 = Comic("名探偵コナン", 500, "推理もの", "10巻")
show(m1)
show(c1)
よくあるバグ
  • 与件のクラス名・引数・返り値文字列を資料とずらす
  • 同名メソッドなのにクラスごとに別関数だけ書いて共通窓口を作らない
  • self. / super() / import / pack / mainloop の付け忘れ
採点ポイント
  • `super().__init__`
  • `super().display()`
  • 指定どおりの引数
  • 共通関数から display

用語一覧(想起用)

初出の本説明は入門カード。ここは索引。主役はコーディングドリル。

用語一文手がかり
スコープ変数が有効に使える範囲ローカル vs グローバル
ローカル変数関数ブロック内だけで生きる変数関数を抜けると消える
グローバル変数ファイル先頭レベルで定義される変数ファイル全体で参照可
インスタンス変数self. で持つ、個体ごとのデータself.job
クラス変数クラス全体で共有するデータクラス名.変数
ポリモーフィズム同じ操作名で型ごとに違う処理を呼び出せることobj.cry()
オーバーライド親の同名メソッドを子で上書きすることDog.cry
標準ライブラリPython同梱で import して使う道具箱random, math, calendar
外部ライブラリpip 等で追加インストールする道具箱Pillow
モジュール拡張子 .py の道具ファイルimport math
パッケージ複数モジュールをまとめたディレクトリfrom tkinter import …
Pillow / PIL画像を開く・変形する外部ライブラリfrom PIL import Image
tkinter標準の GUI ライブラリTk, Button, Label
ウィジェット画面に置く部品(Button 等)pack で配置
packウィジェットを上下左右に並べる配置法side=LEFT
StringVarEntry 等と連動する文字列ウィジェット変数moji.get()
BooleanVarチェックの有無を持つ真偽ウィジェット変数bln.set(True)
IntVarラジオの value を持つ整数ウィジェット変数int_v.get()
Canvas図形・画像を描く描画面create_image
PhotoImagetkinter で PNG 等を扱う画像オブジェクトjpg 非対応
move / coordsCanvas 上の相対移動 / 絶対座標設定攻撃アニメ
update描画をその時点で画面に反映する移動の直後に呼ぶ
継承親クラスの機能を子が引き継ぐことclass Comic(Book)
super()親クラスのメソッドを子から呼ぶ仕組みsuper().__init__

確認クイズ

自信度つき。高自信で誤答したトピックは間違いノートへ。コード手書きは演習ドリル優先。

間違いノート

まだなし。診断の高自信誤答が溜まる。

    Layer0 — 1行地図+手書き順

    • スコープ: 作った場所=見える範囲 → 入門 / 本編 / L3入口
    • ポリモーフィズム: Circle/Square → D01 · Animal → D02
    • ライブラリ: dice → D03 · sleep → D04 · Pillow → D04b · mondai → D05
    • tkinter: Check → D06 · Radio → D07
    • Canvas: GameCharacter・攻撃 → D08(入口 案内
    • 継承総復習: おみくじ → D09 · Book → D10
    • 中間土台: 中間サイト
    試験直前30分 答案型チートを暗唱 → 弱点ドリルを solo 1本 → 暗箱用語は入門カードだけ。
    初見ドリル強制なし。弱点だけ戻る。

    講義回・宿題 parity

    ID内容判定メモ
    L1第1回講義PDFout-of-scope資料未入手。中間サイトのゼロ起点で代替可
    L2-7-mid第2–7回(中間範囲)covered本線外。入門要約+https://ool-midterm.pages.dev/ へ誘導
    L8第8回(6/9・中間試験日の可能性大)out-of-scope講義PDFなし。中間試験日と推定
    L9第9回 スコープ・ポリモーフィズム・標準ライブラリcoveredcore-scope
    L10第10回 Pillow・外部ライブラリcoveredcore-lib
    L11第11回out-of-scope休講想定のため out-of-scope / 欠番
    L12第12回 tkinter 基礎coveredcore-tkinter
    L13第13回 Canvas・GameCharactercoveredcore-canvas
    L13-add7月7日追加(攻撃動作)coveredcore-canvas
    L14第14回 ゲーム復習・おみくじ・Book継承coveredcore-book
    hw-poly宿題 Animal/Dog/Snake ポリモーフィズムcovereddrill-animal
    hw-circle-square宿題 CircleArea/SquareArea+cal_areacovereddrill-circle-square
    hw-dice宿題 サイコロ2個+math.fabscovereddrill-dice
    hw-pillow宿題 Pillow 画像操作covereddrill-pillow
    hw-mondai宿題 mondai関数10回計測covereddrill-mondai
    hw-tk宿題 tkinter チェック/ラジオ・for辞書covereddrill-check
    hw-canvas宿題 Canvas攻撃ボタンcovereddrill-attack
    hw-book宿題 Book/Magazine/Comiccovereddrill-book
    hw-omikuji宿題 おみくじアプリcovereddrill-omikuji
    thin 禁止 宿題同型(Circle/Square、Animal、dice、Pillow、mondai、チェックUI、攻撃move、Book系)は 本編 L3+コーディングドリルに手数あり → covered。 第1/8/11回は out-of-scope(欠番・休講想定)。

    人手ゲート

    • 入門 L1 カードに term-* マーカあり
    • 各本線トピックに L2+L3(途中手順フル)
    • コーディングドリル: 問題文→答案型→worked→faded→solo
    • L4 は別数値・別文言(surface 分離)
    • ASCII 暗箱 pre.term-image なし
    • 中間 URL は既存 midterm を参照(期末は別 slug)