基本的なPythonの操作
Python を最初に触るときに大事なのは、文法を一覧で覚えることではありません。まずは、目の前の値をどう置き、どう確かめ、どう少しずつ加工していくかを体で覚えることです。
このノートでは、小さな成績データを題材にしながら、変数、リスト、辞書、条件分岐、繰り返し、関数、例外処理へと自然に進みます。上から順に読むと、短い処理をどう組み合わせていくかが見えるようにしてあります。
まずは 1 つの値をきちんと持つ
最初に見るのは、とても小さな情報です。名前、受講人数、完了率のように、性質の違う値を並べて持ってみると、Python が数値と文字列をどう扱っているかが一気につかみやすくなります。
この段階では、type(...) の表示を暗記する必要はありません。str は文字、int は整数、float は小数、と出力を見ながら対応づけられれば十分です。
f"..." は、値を文章の中へそのまま差し込むための書き方です。たとえば完了率 0.45 をそのまま表示すると 0.45 ですが、:.0% を付けると「百分率で、小数点以下 0 桁」に直してくれるので 45% になります。
最初は記号が多く見えますが、やっていることは単純で、「中身は同じ値のまま、見せ方だけを整えている」と捉えると理解しやすくなります。
値が増えたら、入れ物を選ぶ
1 人分の情報なら変数だけでも足りますが、点数が 5 個、10 個と増えると入れ物が必要になります。ここで大事なのは、どれが偉いかではなく、何をしたいかで選ぶことです。
- 順番を保ったまま並べたいときはリスト
- 項目名で取り出したいときは辞書
- 重複を消して「あるかどうか」だけ見たいときは集合
同じ題材でも入れ物を変えると、書きやすい処理が変わります。Python の基礎は、この選び分けにかなり集約されています。
ここから先は、同じ点数データを何度も眺め直しながら進みます。まず一部を取り出し、次に条件でラベルを付け、最後に小さく集計します。
つまり、ばらばらの機能を順番に消化するのではなく、1 つのデータを少しずつ扱いやすくしていく流れです。
データを少しずつ加工してみる
インデックスとスライスは「どの位置の値を見るか」を決める道具です。分岐とループは「値ごとに別の処理をする」ための道具です。関数は、それらを名前付きのまとまりにして再利用しやすくするために使います。
この順で読むと、Python の基本機能がそれぞれ孤立したものではなく、ひと続きの作業の一部だと分かります。
import math
from collections import Counter
type は、いま手元にある値が文字列なのか、整数なのか、小数なのかを確かめるための道具です。
Python は変数宣言の段階で型を書かなくても動くので、分からなくなったら実際に type(...) を出して確認する、という姿勢がかなり役に立ちます。
name = "Noema"
students = 32
completion_ratio = 0.45
print(type(name), type(students), type(completion_ratio))
print(f"{name}: {students}人, 完了率 {completion_ratio:.0%}")
リスト、辞書、集合は、同じデータを別の角度から持つための入れ物です。
ここでは scores が「点数を順番つきで並べたもの」、profile が「名前付きの情報」、unique_scores が「重複を除いた点数の集合」に当たります。
集合は表示順が固定ではないので、初学者のうちは『重複が消えたことを見るための入れ物』として読むと十分です。
scores = [72, 88, 65, 91, 88]
profile = {"name": "Aiko", "grade": 1, "club": "AI"}
unique_scores = set(scores)
print("scores:", scores)
print("profile['club']:", profile["club"])
print("unique_scores:", unique_scores)
インデックスは 1 個の値を見る操作、スライスは連続した範囲を見る操作です。
start:end の end が含まれないのは少し癖がありますが、そのおかげで『先頭から何個』という感覚で範囲を切り出しやすくなっています。scores[1:4] なら、1 番目から始めて 4 の手前で止まる、と読めば混乱が減ります。
print("先頭:", scores[0])
print("末尾:", scores[-1])
print("2番目から4番目手前:", scores[1:4])
print("2個おき:", scores[::2])
ここでは、点数を A/B/C に振り分ける小さな判定表を作ります。見るべき主役は labels.append(...) です。
ループは点数を 1 個ずつ取り出し、分岐はその点数に応じて付けるラベルを決めています。zip(scores, labels) は最後に『元の点数と、あとから作ったラベルを並べ直して確認する』ための道具だと思ってください。
labels = []
for score in scores:
if score >= 90:
labels.append("A")
elif score >= 75:
labels.append("B")
else:
labels.append("C")
print(list(zip(scores, labels)))
リスト内包表記は、for で新しいリストを作る処理を短く書いた形です。
最初のうちは、普通の for で意味を理解してから、同じことを 1 行で書き直してみるのがいちばん安全です。『急に難しい新機能が出てきた』というより、『さっきの処理を縮めた書き方』として受け取るのがよいです。
# 通常の for
squared_for = []
for x in range(1, 6):
squared_for.append(x * x)
# 内包表記
squared_comp = [x * x for x in range(1, 6)]
print(squared_for)
print(squared_comp)
関数は、何度も使う処理に名前を付けるための仕組みです。
ここで作る summarize_scores は、点数の個数、平均、最高点、最低点をひとまとめに返します。分析コードでは、こうして『意味のあるひとかたまり』を関数にしておくと、あとから読み返すのがかなり楽になります。
def summarize_scores(values):
count = len(values)
avg = sum(values) / count
best = max(values)
worst = min(values)
return {"count": count, "avg": avg, "best": best, "worst": worst}
summary = summarize_scores(scores)
print(summary)
現実のデータは、いつもきれいに数値へ変換できるとは限りません。
try は『ここは失敗するかもしれない』と先に宣言する書き方で、except ValueError は『数値へ直せないという種類の失敗だけ受け取る』という意味です。エラーを黙って無視するのではなく、どこで失敗したかを出力しておくと、後で原因を追いやすくなります。
raw_inputs = ["12", "7", "oops", "20"]
parsed = []
for item in raw_inputs:
try:
parsed.append(int(item))
except ValueError:
print(f"変換失敗: {item}")
print("parsed:", parsed)
最後は、ここまで作ってきたものを小さな集計としてまとめます。
Counter(labels) は各ラベルが何回出たかを数えます。平均点はクラス全体の真ん中を表します。標準偏差は『点数がどのくらい散らばっているか』を見る値です。
平均との差が小さい点ばかりなら標準偏差も小さくなり、ばらつきが大きいほど大きくなります。ここでは式の暗記よりも、『平均だけでは見えない散らばり方を補う数』という感覚を持てれば十分です。
label_counter = Counter(labels)
avg_score = sum(scores) / len(scores)
std_score = math.sqrt(sum((x - avg_score) ** 2 for x in scores) / len(scores))
print("label count:", label_counter)
print(f"average={avg_score:.2f}, std={std_score:.2f}")
Python 基礎で本当に大切なのは、記号の一覧を覚えることよりも、値の置き方と処理の流れを自分で追えることです。
もし復習するなら、点数の境界を変える、別の列を足す、失敗する文字列を 1 つ増やす、といった小さな変更を加えてみてください。出力がどう変わるかを追う作業そのものが、いちばん良い練習になります。