Pythonの基本を独学で身につける完全ガイド|変数・制御構文からオブジェクト指向まで
📋 この記事の目次
前回、Gitで自己紹介カードのソースコードを管理できるようになりました。ここからは、ページの「見た目」だけでなく「処理」を作る力を身につけていきます。まず選ぶ言語がPythonです。
「文法の説明は理解できるのに、いざ自分でプログラムを組もうとすると何も書けない」 「if文もfor文も知っているのに、それらをどう組み合わせればいいか分からない」
これらを解消するために、今回は 「訪問者からのコメントを集計するスクリプト」 を、機能を少しずつ足しながら作っていきます。前回のHTMLフォームで受け取る想定のコメントを、まずはPythonの中だけで扱ってみましょう。
Pythonは「アルバイトへの作業マニュアル」だと考える
プログラムとは、コンピュータという「新人アルバイト」に渡す作業マニュアルです。
- 変数 = 「材料に名前を貼ったラベル」
- 条件分岐(if) = 「もし〜だったら、こうする」という指示
- ループ(for/while) = 「これを全部終わるまで繰り返して」という指示
- 関数 = 「よく使う一連の作業をひとまとめにして、名前をつけたもの」
Pythonが初心者に人気なのは、このマニュアルを英語の文章に近い、読みやすい書き方で書けるからです。
🧓 ベテランの現場コラム 「文法は分かるのに書けない」というのは、実はプログラマーなら誰もが通る道です。文法(単語や文法規則)を知っていることと、それを使って「やりたいこと」を分解して指示に落とし込めることは別のスキルです。この記事のように、小さな題材を少しずつ育てながら手を動かすのが、いちばんの近道です。
Part A: Pythonの基礎
Pythonとは・最初のプログラム
print("こんにちは、訪問者コメント集計ツールへようこそ")
print()は「画面に表示する」という命令(関数)です。まずはこの1行が動く環境(python3 script.pyで実行)を用意しましょう。
変数と型
visitor_name = "山田花子" # 文字列(str)
message_count = 3 # 整数(int)
average_score = 4.5 # 浮動小数点数(float)
is_published = True # 真偽値(bool)
文字列操作
message = "とても参考になりました!"
print(len(message)) # 文字数
print(message.upper()) # 大文字化(英語の場合)
print(f"{visitor_name}さんのコメント: {message}") # f文字列(変数を埋め込む)
ユーザー入力と型変換
raw_input_value = input("評価を1〜5で入力してください: ")
score = int(raw_input_value) # 文字列のままでは計算できないため数値に変換
input()はいつも「文字列」として値を受け取るため、数値として計算したいときはint()やfloat()で変換する必要があります。ここを忘れると、次に説明する制御構文でつまずく人が非常に多いです。
Part B: 制御構文(プログラムの「流れ」を作る)
条件分岐
score = 4
if score >= 4:
evaluation = "高評価"
elif score >= 2:
evaluation = "普通"
else:
evaluation = "要改善"
print(evaluation)
例外処理
try:
score = int(input("評価を入力してください: "))
except ValueError:
print("数字を入力してください")
score = 0
「起きるかもしれないエラー」を先回りして処理しておくことで、想定外の入力でプログラムが止まってしまう事態を防げます。
ループ処理とRange関数
messages = ["ありがとう", "また来ます", "勉強になりました"]
for message in messages:
print(f"- {message}")
for i in range(3): # 0, 1, 2 を順に処理
print(f"{i}件目の処理")
🧓 ベテランの現場コラム
forループで「何番目の要素か」を数える処理を書くとき、初心者はついi = i + 1をループの中に自分で書いてしまいがちです。Pythonのfor ... in ...構文やrange()は、その数え上げ処理そのものを肩代わりしてくれます。「自分で数える」より先に「言語の機能で数えられないか」を疑う癖をつけましょう。
Part C: データ構造(コメントをまとめて扱う)
文字列のインデックスとスライス
message = "とても良かったです"
print(message[0]) # "と"
print(message[:4]) # "とても"
リストとそのメソッド
messages = []
messages.append("ありがとうございます")
messages.append("また来ます")
messages.remove("また来ます")
print(len(messages))
タプル・セット・辞書
coordinates = (35.68, 139.76) # タプル:変更されたくない組データ
tags = {"感謝", "応援", "感謝"} # セット:重複が自動で1つにまとまる
print(tags) # {"感謝", "応援"}
comment = {
"visitor_name": "山田花子",
"message": "とても参考になりました",
"score": 5,
}
print(comment["visitor_name"])
辞書(dict)は「名前付きのラベルで値を取り出せる箱」で、この後のPart Dで作る「コメント1件分のまとまり」の土台になります。
Part D: 関数定義とモジュール
関数の基本構造
def summarize_comments(comments):
total = len(comments)
average = sum(c["score"] for c in comments) / total if total > 0 else 0
return total, average
comments = [
{"visitor_name": "山田花子", "message": "参考になりました", "score": 5},
{"visitor_name": "佐藤次郎", "message": "もう少し詳しく知りたい", "score": 3},
]
total, average = summarize_comments(comments)
print(f"件数: {total}件, 平均評価: {average:.1f}")
「よく使う処理」を関数にまとめておくと、同じロジックを何度も書かずに済み、修正するときも1箇所直せば済みます。
モジュールとインポート
import statistics
scores = [5, 3, 4]
print(statistics.mean(scores))
Pythonには最初から便利な機能(標準ライブラリ)が用意されており、importで読み込んで使います。平均値の計算のような定番処理は、自分で書く前に標準ライブラリに無いか調べる価値があります。
Part E: オブジェクト指向と発展的な機能
オブジェクト指向プログラミング(OOP)
コメント1件を「辞書」ではなく、専用の型(クラス)として表現してみます。
class Comment:
def __init__(self, visitor_name, message, score):
self.visitor_name = visitor_name
self.message = message
self.score = score
def is_positive(self):
return self.score >= 4
comment = Comment("山田花子", "参考になりました", 5)
print(comment.is_positive()) # True
クラスは「データ(visitor_nameなど)」と「そのデータに対する操作(is_positiveなど)」をひとまとめにする仕組みです。データが増えてきたら、辞書よりクラスの方が扱いやすくなります。
デコレータ
def log_call(func):
def wrapper(*args, **kwargs):
print(f"{func.__name__} を実行します")
return func(*args, **kwargs)
return wrapper
@log_call
def summarize_comments(comments):
return len(comments)
デコレータは「既存の関数に、前後の処理を後付けする」仕組みです。ログ出力や、後の回で扱うテスト・権限チェックなど、共通処理を差し込みたいときによく使われます。
ラムダ式
comments_sorted = sorted(comments, key=lambda c: c["score"], reverse=True)
ラムダ式は「名前をつけるほどでもない、その場限りの小さな関数」です。sortedの並び替え基準を指定するときのような、一度きりの用途でよく使われます。
Part F: ベストプラクティス
- PEP 8(命名規則): 変数・関数名は
snake_case(例:visitor_name)、クラス名はPascalCase(例:Comment)にする - リスト内包表記:
[c["message"] for c in comments if c["score"] >= 4]のように、for文を1行で書ける記法。読みやすさとのバランスを見て使う - 条件式(三項演算子):
evaluation = "高評価" if score >= 4 else "要改善"のように、簡単な条件分岐を1行にまとめられる
実践プロジェクト:訪問者コメント集計スクリプトを完成させる
Commentクラスを定義する- サンプルのコメント一覧(リスト)を用意する
summarize_comments関数で件数・平均評価を出す- 例外処理で、数値以外が入力されたときにも落ちないようにする
- リスト内包表記で「高評価のコメントだけ」を抽出する処理を書く
これができれば、次回のDjangoで「Webから送られてきたコメントを処理する」ステップに進む土台が整います。
🧓 ベテランの現場コラム 現場でも、最初から複雑なクラス設計をする必要はありません。まずは辞書やリストで動くものを作り、「同じような処理を何度も書いている」「データの形が複雑になってきた」と感じた瞬間にクラス化を検討する、くらいの温度感で十分です。
🧠 理解度チェック(一部抜粋)
- Q.
input()で受け取った値をそのまま数値計算に使うとエラーになるのはなぜ? →input()は常に文字列として値を返すため、int()等での変換が必要 - Q. リストとタプルの主な違いは? → タプルは作成後に中身を変更できない(不変)
- Q. クラスを使う利点は? → データとそのデータに対する操作をひとまとめにでき、扱う情報が複雑になったときに整理しやすい
挫折ポイントTOP3と対処法
1. 「インデント(字下げ)がずれてエラーになる」問題
Pythonはインデントでブロック(ifやforの範囲)を判断する言語です。タブとスペースを混在させず、エディタの自動インデント設定を統一しましょう。
2. 「型が違う」というエラーが出る問題
文字列と数値を混同して足し算しようとした場合などに発生します。type(変数名)で今の型を確認する癖をつけると原因特定が早まります。
3. 「何から手をつければいいか分からない」問題
いきなり完成形を書こうとせず、print()で途中経過を確認しながら1行ずつ動かす「小さく試す」進め方に切り替えましょう。
🧓 ベテランの現場コラム ベテランでも、いきなり正解のコードが書けるわけではありません。
print()をあちこちに仕込んで変数の中身を確認しながら、少しずつ組み上げていくのが実務でも普通のやり方です。「一発で完成させなければ」というプレッシャーを自分にかけすぎないことが、独学を続けるコツです。
この先、何を学べばいいか
コメントを集計するスクリプトが作れるようになったら、次はこれを 「Webアプリ」として動かす「Django」 に進みます。今はPythonの中だけで完結していたコメント処理を、実際にブラウザからのフォーム送信で受け取れるようにしていきます。
まとめ
- 変数・型・制御構文(if/for/try)はプログラムの「流れ」を作る基本部品
- リスト・タプル・セット・辞書は目的に応じて使い分ける
- 関数化・クラス化は「同じ処理を繰り返し書いている」と感じたときに検討する
- デコレータ・ラムダ式は、まず存在を知っておくだけで読めるコードの幅が広がる
- 完璧な設計より、まず小さく動かしながら育てる進め方が独学には向いている
参考にした学習リソースについて
本記事は、ハーバード大学が提供する人気講座「CS50’s Web Programming with Python and JavaScript」の内容を参考にしつつ、独自の題材・独自の構成・自作のサンプルで書き下ろしたオリジナル解説記事です。CS50そのものに興味を持った方は、以下の公式サイトも覗いてみてください。
- CS50 公式サイト: https://cs50.harvard.edu/x/
🎓 理解度テスト
学んだ内容を確認しましょう。全6問。