まず、「プログラミング」とは何でしょうか。
プログラミングとは、コンピュータに「これをやってください」と指示を出すことです。
ただし、コンピュータは日本語を理解できません。そこで、コンピュータが理解できる特別な言葉、つまり「プログラミング言語」を使って指示を書く必要があるのです。
この指示書のことを「プログラム」や「コード」と呼びます。
Pythonは数あるプログラミング言語の中でも、特に「人間にとって読みやすく、書きやすい」ことを重視して作られた言語です。
例えば、英語で「もし〜なら」は「if」と書きますが、Pythonでも同じく「if」と書きます。
このように、日常的な英語に近い表現で書けるため、プログラミングが初めての方にも親しみやすい言語なのです。
今回は、料理のレシピを学ぶように、一つ一つの「材料」(プログラミングの要素)と「調理法」(書き方)を説明していきます。
ちなみに、Pythonの実行環境としては、Jupyter Lab(もしくは、Jupyter Notebook)を前提に話しを進めます。環境設定に関しては以下の記事を参考にしてください。
Contents
変数:データに名前をつけて保管する仕組み
プログラミングで最初に理解する必要があるのが「変数」という概念です。変数とは、データを入れておく「名前付きの箱」のようなものです。
日常生活で例えてみましょう。あなたの家には、様々なものを入れる引き出しがあると思います。
一つの引き出しには「文房具」というラベルを貼ってペンや消しゴムを入れ、別の引き出しには「薬」というラベルを貼って常備薬を入れているかもしれません。
プログラミングの変数も同じです。データ(中身)を入れる箱に、分かりやすい名前(ラベル)をつけて管理するのです。
では、JupyterLabを開いて、実際に変数を作ってみましょう。新しいノートブックを作成し、以下のコードを一つずつ入力して実行してみてください。
# これは変数を作る基本的な書き方です # 変数名 = 値 という形で書きます age = 25 # ageという名前の箱に、25という数字を入れています # この行は「コメント」と呼ばれ、#から始まる文字はPythonに無視されます # 人間が読むための説明を書くのに使います
このコードを実行すると、何も表示されないかもしれません。
でも心配しないでください。Pythonは静かに「age」という名前の箱を作り、その中に「25」という数字を入れてくれました。
では、この箱の中身を確認してみましょう。
# 変数の中身を確認する方法その1:変数名だけを書く age
実行すると「25」と表示されるはずです。もう一つの確認方法もあります。
# 変数の中身を確認する方法その2:print関数を使う print(age) # printは「画面に表示してください」という命令です
なぜ2つの方法があるのでしょうか。
JupyterLabでは、セル(コードを書く枠)の最後の行に変数名を書くと、その中身が自動的に表示されます。
しかし、複数の変数を表示したい場合や、プログラムの途中で値を確認したい場合は、print()
という関数を使う必要があります。
関数については後で詳しく説明しますが、今は「特定の仕事をしてくれる命令」だと理解してください。
それでは、もう少し多くの変数を作って、その特徴を理解していきましょう。
# 様々な種類のデータを変数に入れてみます # 整数:小数点のない数字 age = 25 number_of_items = 100 # 小数(浮動小数点数):小数点のある数字 height = 170.5 # センチメートル weight = 65.3 # キログラム # 文字列:文字の並び、必ず引用符で囲みます name = "田中太郎" # ダブルクォート(")で囲む address = '東京都渋谷区' # シングルクォート(')でも大丈夫 # 真偽値(ブール値):正しい(True)か間違い(False)かの2択 is_student = True # 学生である(真) has_license = False # 免許を持っていない(偽) # すべて表示してみましょう print("年齢:", age) print("身長:", height, "cm") print("名前:", name) print("学生ですか?", is_student)
以下、実行結果です。
年齢: 25 身長: 170.5 cm 名前: 田中太郎 学生ですか? True
ここで大切なポイントがいくつかあります。
まず、文字を変数に入れるときは、必ず引用符("
または'
)で囲む必要があります。
なぜでしょうか。もし引用符がないと、Pythonは「田中太郎」を変数名だと勘違いしてしまうからです。引用符で囲むことで、「これは文字データですよ」とPythonに伝えているのです。
次に、True
とFalse
という特別な値について説明しましょう。
これらは「真偽値」や「ブール値」と呼ばれ、「はい/いいえ」「ある/ない」「正しい/間違い」のような二択の情報を表現するために使います。
注意点として、True
とFalse
の最初の文字は必ず大文字で書く必要があります。
変数名の付け方:読みやすいコードを書くためのルール
変数には好きな名前をつけることができますが、いくつかのルールと、守った方がよい慣習があります。
まずは絶対に守らなければならないルールから見ていきましょう。
# 良い変数名の例 customer_age = 35 # 顧客の年齢 total_sales = 150000 # 売上合計 average_score = 82.5 # 平均点 # これらはエラーになる悪い例です(実行しないでください) # 1st_place = "金メダル" # エラー:数字から始まってはいけません # customer-age = 35 # エラー:ハイフン(-)は使えません(引き算と混同されるため) # customer age = 35 # エラー:スペースは使えません # for = 100 # エラー:forなどのPythonの予約語(特別な意味を持つ単語)は使えません # 技術的には可能だが、避けるべき例 a = 100 # 何を表しているか分からない x1 = "田中" # 意味不明 data = 500 # 何のデータか分からない # より良い名前に変更 sales_amount = 100 # 売上金額だと一目で分かる customer_name = "田中" # 顧客名だと明確 monthly_sales = 500 # 月間売上だと理解しやすい
変数名を付けるときの重要なルールをまとめると……
- アルファベット(a-z、A-Z)またはアンダースコア(_)で始める必要があります
- 2文字目以降は、アルファベット、数字、アンダースコアが使えます
- Pythonの予約語(if、for、while、def、classなど)は使えません
- 大文字と小文字は区別されます(
Age
とage
は別の変数として扱われます)
また、読みやすいコードを書くための慣習として……
- 変数名は小文字で書き、単語の区切りにはアンダースコアを使います(例:
customer_name
)。これを「スネークケース」と呼びます - 変数名は、その中身が何かを表す意味のある名前にします
- 一般的な略語(avg = average、max = maximum など)は使っても構いませんが、独自の略語は避けましょう
データ型を理解する:なぜ型が重要なのか
先ほど、整数、小数、文字列、真偽値という4つの基本的なデータの種類を見ました。
プログラミングでは、これらを「データ型」と呼びます。なぜデータ型を意識する必要があるのでしょうか。
実は、データ型によってできることとできないことが異なるからです。例を見てみましょう。
# 数字同士の計算 price = 100 quantity = 3 total = price * quantity # 掛け算ができます print("合計金額:", total, "円") # 文字列同士の結合 first_name = "太郎" last_name = "田中" full_name = last_name + first_name # +で文字列を連結できます print("氏名:", full_name) # では、数字と文字列を足すとどうなるでしょうか? # age = 25 # message = "私は" + age + "歳です" # これはエラーになります! # 正しくは、数字を文字列に変換する必要があります age = 25 message = "私は" + str(age) + "歳です" # str()で数字を文字列に変換 print(message) # または、f文字列という便利な方法もあります(推奨) message = f"私は{age}歳です" # f"..."の中で{変数名}と書くと、自動的に文字列に変換されます print(message)
以下、実行結果です。
合計金額: 300 円 氏名: 田中太郎 私は25歳です 私は25歳です
str()
のような、データ型を変換する機能を「型変換」や「キャスト」と呼びます。よく使う型変換をまとめてみました。
# 型変換の例 # 文字列から数字への変換 text_number = "123" actual_number = int(text_number) # 文字列を整数に変換 print(f"変換前の型: {type(text_number)}") # type()で型を確認できます print(f"変換後の型: {type(actual_number)}") # 小数を含む文字列の変換 price_text = "1500.5" price_number = float(price_text) # 文字列を小数に変換 print(f"価格: {price_number}円") # 整数と小数の相互変換 integer_value = 10 float_value = float(integer_value) # 10 → 10.0 print(f"整数から小数: {integer_value} → {float_value}") decimal_value = 3.7 integer_value = int(decimal_value) # 3.7 → 3(小数点以下は切り捨て) print(f"小数から整数: {decimal_value} → {integer_value}") # 注意:int()は切り捨てで、四捨五入ではありません # 四捨五入したい場合は round() を使います rounded_value = round(3.7) # 3.7 → 4 print(f"四捨五入: 3.7 → {rounded_value}")
以下、実行結果です。
変換前の型: <class 'str'> 変換後の型: <class 'int'> 価格: 1500.5円 整数から小数: 10 → 10.0 小数から整数: 3.7 → 3 四捨五入: 3.7 → 4
リスト:複数のデータをまとめて管理する
これまでは一つの変数に一つの値を入れていましたが、実際のデータ分析では、複数の値をまとめて扱いたい場合がよくあります。
例えば、5つの店舗の売上データや、あるクラスの生徒全員のテストの点数などです。
このような場合に使うのが「リスト」です。
リストは、複数の値を順番に並べて保管できる入れ物です。本棚に本を順番に並べるようなイメージです。
# リストの作り方 # 角括弧 [ ] を使って、値をカンマで区切って書きます scores = [75, 82, 90, 68, 95] # 5人のテストの点数 print("テストの点数一覧:", scores) print("データの個数:", len(scores)) # len()でリストの長さ(要素数)が分かります
以下、実行結果です。
テストの点数一覧: [75, 82, 90, 68, 95] データの個数: 5
リストの中の特定の値を取り出すには、「インデックス」という番号を使います。
ここで重要な注意点があります。Pythonでは、インデックスは0から始まります。つまり、1番目の要素はインデックス0、2番目の要素はインデックス1、という具合です。
なぜ0から始まるのでしょうか。
これはコンピュータサイエンスの歴史的な理由によるものですが、「最初の要素は、リストの先頭から0個離れた位置にある」と考えると理解しやすいかもしれません。
# インデックスを使った要素へのアクセス scores = [75, 82, 90, 68, 95] # 個別の要素を取り出す print("1人目の点数:", scores[0]) # 75が表示されます(インデックス0) print("2人目の点数:", scores[1]) # 82が表示されます(インデックス1) print("3人目の点数:", scores[2]) # 90が表示されます(インデックス2) # 最後の要素を取り出す便利な方法 print("最後の人の点数:", scores[-1]) # 95が表示されます # マイナスのインデックスは後ろから数えます # -1は最後、-2は最後から2番目、という具合です # リストの内容を変更する print("\n採点ミスを修正します") print("修正前:", scores) scores[3] = 78 # 4人目(インデックス3)の点数を68から78に修正 print("修正後:", scores)
以下、実行結果です。
1人目の点数: 75 2人目の点数: 82 3人目の点数: 90 最後の人の点数: 95 採点ミスを修正します 修正前: [75, 82, 90, 68, 95] 修正後: [75, 82, 90, 78, 95]
リストには新しい要素を追加したり、削除したりすることもできます。
# リストの操作 fruits = ["りんご", "バナナ", "オレンジ"] print("最初のリスト:", fruits) # 要素を追加する fruits.append("ぶどう") # appendは「最後に追加する」という意味 print("ぶどうを追加:", fruits) # 特定の位置に要素を挿入する fruits.insert(1, "いちご") # インデックス1の位置に「いちご」を挿入 print("いちごを2番目に挿入:", fruits) # 要素を削除する fruits.remove("バナナ") # 「バナナ」を削除 print("バナナを削除:", fruits) # リストが空かどうか確認する if len(fruits) > 0: print(f"フルーツは{len(fruits)}種類あります") else: print("フルーツがありません")
以下、実行結果です。
最初のリスト: ['りんご', 'バナナ', 'オレンジ'] ぶどうを追加: ['りんご', 'バナナ', 'オレンジ', 'ぶどう'] いちごを2番目に挿入: ['りんご', 'いちご', 'バナナ', 'オレンジ', 'ぶどう'] バナナを削除: ['りんご', 'いちご', 'オレンジ', 'ぶどう'] フルーツは4種類あります
リストの一部分だけを取り出す「スライシング」という便利な機能もあります。
# スライシング:リストの一部を切り出す numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 基本的な書き方:リスト[開始:終了] # 注意:終了インデックスの要素は含まれません print("インデックス2から4まで:", numbers[2:5]) # [2, 3, 4]が表示される # 開始を省略すると最初から print("最初から3つ:", numbers[:3]) # [0, 1, 2] # 終了を省略すると最後まで print("インデックス7から最後まで:", numbers[7:]) # [7, 8, 9] # ステップを指定することもできます print("1つ飛ばし:", numbers[::2]) # [0, 2, 4, 6, 8] print("逆順:", numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
以下、実行結果です。
インデックス2から4まで: [2, 3, 4] 最初から3つ: [0, 1, 2] インデックス7から最後まで: [7, 8, 9] 1つ飛ばし: [0, 2, 4, 6, 8] 逆順: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
辞書:データに名前をつけて整理する
リストは順番でデータを管理しますが、「名前」でデータを管理したい場合もあります。
例えば、一人の顧客の情報を管理する場合、「0番目が名前、1番目が年齢、2番目がメールアドレス…」と覚えるのは大変です。
そこで使うのが「辞書(ディクショナリ)」です。
辞書は、「キー(鍵)」と「値(あたい)」のペアでデータを管理します。
実際の辞書で「単語」を調べると「意味」が出てくるように、「キー」を指定すると「値」を取り出せます。
# 辞書の作り方 # 波括弧 { } を使い、キー: 値 の形式で書きます person = { "name": "山田太郎", "age": 30, "email": "yamada@example.com" } # 値を取り出す print("名前:", person["name"]) print("年齢:", person["age"]) # 新しいキーと値を追加する person["phone"] = "090-1234-5678" print("\n電話番号を追加後:") print(person)
以下、実行結果です。
名前: 山田太郎 年齢: 30 電話番号を追加後: {'name': '山田太郎', 'age': 30, 'email': 'yamada@example.com', 'phone': '090-1234-5678'}
辞書を使うと、構造化されたデータを分かりやすく管理できます。
# より実践的な例:商品情報の管理 product = { "id": "P001", "name": "ノートパソコン", "price": 98000, "stock": 15, # 在庫数 "features": ["軽量", "長時間バッテリー", "高性能"] # リストも値として使える } print("商品情報") print("-" * 30) print(f"商品名: {product['name']}") print(f"価格: {product['price']:,}円") # :, で3桁ごとにカンマを入れる print(f"在庫: {product['stock']}台") print(f"特徴: {', '.join(product['features'])}") # リストを文字列に変換 # 在庫を更新する print("\n3台売れました") product["stock"] = product["stock"] - 3 # または product["stock"] -= 3 と書ける print(f"残り在庫: {product['stock']}台") # キーが存在するか確認してから値を取得する(安全な方法) discount = product.get("discount", 0) # discountキーがなければ0を返す print(f"割引: {discount}%")
以下、実行結果です。
商品情報 ------------------------------ 商品名: ノートパソコン 価格: 98,000円 在庫: 15台 特徴: 軽量, 長時間バッテリー, 高性能 3台売れました 残り在庫: 12台 割引: 0%
条件分岐:もし〜なら、を表現する
プログラムで「もし〜なら、これをする」という判断を表現するには、if
文を使います。
日常生活でも「もし雨が降ったら傘を持っていく」のような判断をしますよね。それと同じことをプログラムで表現できます。
# 基本的な if 文 temperature = 32 if temperature >= 30: print("今日は暑いですね!") print("水分補給を忘れずに。") # インデント(字下げ)された部分がifの中身 print("この行は常に実行されます") # インデントがないので、ifの外
以下、実行結果です。
今日は暑いですね! 水分補給を忘れずに。 この行は常に実行されます
ここで重要なのが「インデント」です。
インデントとは、行の先頭に入れる空白のことで、Pythonでは通常4つのスペースを使います。
if
文の条件が真(True)の場合、インデントされた部分だけが実行されます。
条件が成立しない場合の処理も書きたい場合は、else
を使います。
# if-else 文 score = 65 if score >= 70: print("合格です!") print("おめでとうございます。") else: print("不合格です。") print("次回がんばりましょう。")
以下、実行結果です。
不合格です。 次回がんばりましょう。
複数の条件を順番にチェックしたい場合は、elif
(else ifの略)を使います。
# if-elif-else 文 score = 85 if score >= 90: print("評価: S(素晴らしい!)") elif score >= 80: print("評価: A(よくできました)") elif score >= 70: print("評価: B(合格です)") elif score >= 60: print("評価: C(もう少し)") else: print("評価: D(がんばりましょう)") # 上から順番に条件をチェックし、最初に成立した条件の処理だけを実行します
以下、実行結果です。
評価: A(よくできました)
条件を組み合わせることもできます。
# 複数の条件を組み合わせる age = 20 is_student = True # and:両方の条件が成立する場合 if age >= 20 and is_student: print("成人の学生です") # or:どちらかの条件が成立する場合 if age < 18 or age >= 65: print("割引対象です(未成年またはシニア)") # not:条件を否定する if not is_student: print("学生ではありません") else: print("学生です")
以下、実行結果です。
成人の学生です 学生です
繰り返し処理:同じ処理を効率的に実行する
データ分析では、大量のデータに対して同じ処理を繰り返すことがよくあります。
例えば、100人の顧客データすべてに対して同じ計算をしたい場合、一つ一つ手作業で書くのは大変です。そこで使うのが「ループ(繰り返し)」です。
Pythonには主に2種類のループがあります。
まず、for
ループから見ていきましょう。
# for ループの基本 # リストの各要素に対して処理を繰り返す fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"] print("フルーツ一覧:") for fruit in fruits: # fruitsの中の要素を一つずつfruitに入れて処理 print(f"- {fruit}") # この行が4回実行される # 仕組みの説明: # 1回目:fruit = "りんご" として処理 # 2回目:fruit = "バナナ" として処理 # 3回目:fruit = "オレンジ" として処理 # 4回目:fruit = "ぶどう" として処理 # リストの要素がなくなったらループ終了
以下、実行結果です。
フルーツ一覧: - りんご - バナナ - オレンジ - ぶどう
数字の範囲で繰り返したい場合は、range()
関数を使います。
# range()を使った繰り返し print("1から5までカウント:") for i in range(1, 6): # range(開始, 終了) ※終了の値は含まれない print(f"{i}回目の処理") # range()の詳しい使い方 print("\n0から4まで(引数1つ):") for i in range(5): # range(5) は 0, 1, 2, 3, 4 を生成 print(i, end=" ") # end=" " で改行せずにスペースで区切る print("\n\n2ずつ増やす:") for i in range(0, 10, 2): # range(開始, 終了, ステップ) print(i, end=" ") # 0, 2, 4, 6, 8 が表示される print() # 最後に改行
以下、実行結果です。
1から5までカウント: 1回目の処理 2回目の処理 3回目の処理 4回目の処理 5回目の処理 0から4まで(引数1つ): 0 1 2 3 4 2ずつ増やす: 0 2 4 6 8
インデックス(0,1,2,…)と値(scoresの値)を同時に取得したい場合は、enumerate()
関数が便利です。
# enumerate()を使った繰り返し scores = [85, 92, 78, 95, 88] print("テスト結果:") for index, score in enumerate(scores): student_number = index + 1 # 人間にとっては1番目から始まる方が自然 print(f"生徒{student_number}: {score}点") # enumerate()に start パラメータを指定することもできます print("\n別の書き方:") for student_number, score in enumerate(scores, start=1): print(f"生徒{student_number}: {score}点")
以下、実行結果です。
テスト結果: 生徒1: 85点 生徒2: 92点 生徒3: 78点 生徒4: 95点 生徒5: 88点 別の書き方: 生徒1: 85点 生徒2: 92点 生徒3: 78点 生徒4: 95点 生徒5: 88点
while
ループは、条件が成立している間、処理を繰り返します。
# while ループの基本 count = 0 print("カウントアップ開始") while count < 5: # countが5未満の間、繰り返す print(f"現在のカウント: {count}") count = count + 1 # カウントを1増やす(count += 1 とも書ける) print(f"最終カウント: {count}") # 無限ループに注意! # 以下のようなコードは条件が永遠に成立するため、プログラムが止まりません # while True: # print("止まりません!") # もし実行してしまったら、メニューの Kernel → Interrupt で停止できます
以下、実行結果です。
カウントアップ開始 現在のカウント: 0 現在のカウント: 1 現在のカウント: 2 現在のカウント: 3 現在のカウント: 4 最終カウント: 5
ループの中でbreak
とcontinue
を使うと、より柔軟な制御ができます。
# break:ループを途中で抜ける print("負の数が見つかったら処理を中止:") numbers = [10, 20, 30, -5, 40, 50] for num in numbers: if num < 0: print(f"負の数 {num} を発見!処理を中止します。") break # ループを抜ける print(f"処理中: {num}") # continue:その回の以降の処理をスキップして次へ print("\n\n偶数だけを処理:") for i in range(10): if i % 2 == 1: # % は余りを求める演算子。奇数なら余りは1 continue # 次の繰り返しへスキップ print(f"偶数: {i}")
以下、実行結果です。
負の数が見つかったら処理を中止: 処理中: 10 処理中: 20 処理中: 30 負の数 -5 を発見!処理を中止します。 偶数だけを処理: 偶数: 0 偶数: 2 偶数: 4 偶数: 6 偶数: 8
関数:処理をまとめて再利用可能にする
プログラミングで同じ処理を何度も書くのは効率的ではありません。
「関数」を使うと、一連の処理に名前をつけて、何度でも呼び出せるようにできます。数学の関数のように、入力を受け取って、処理をして、結果を返すことができます。
まず、最もシンプルな関数から始めましょう。
# 関数の定義(作り方) def greet(): # def は define(定義する)の略 """挨拶をする関数""" # これは docstring と呼ばれる説明文 print("こんにちは!") print("今日もがんばりましょう。") # 関数の呼び出し(使い方) greet() # () を付けることで関数を実行 # 何度でも呼び出せます print("\n2回目:") greet()
以下、実行結果です。
こんにちは! 今日もがんばりましょう。 2回目: こんにちは! 今日もがんばりましょう。
関数に値を渡すこともできます。
渡す値を「引数」または「パラメータ」と呼びます。
# 引数を受け取る関数 def greet_with_name(name): # name が引数 """名前付きで挨拶する関数""" print(f"こんにちは、{name}さん!") # 使用例 greet_with_name("田中") greet_with_name("山田") # 複数の引数を受け取る関数 def calculate_rectangle_area(width, height): """長方形の面積を計算して表示する関数""" area = width * height print(f"幅{width}、高さ{height}の長方形の面積は{area}です") calculate_rectangle_area(5, 3) calculate_rectangle_area(10, 7)
以下、実行結果です。
こんにちは、田中さん! こんにちは、山田さん! 幅5、高さ3の長方形の面積は15です 幅10、高さ7の長方形の面積は70です
関数は値を返すこともできます。
返される値を「戻り値」または「返り値」と呼びます。
# 値を返す関数 def add(a, b): """2つの数を足して結果を返す関数""" result = a + b return result # return で値を返す # 関数の結果を変数に保存 sum_value = add(10, 20) print(f"10 + 20 = {sum_value}") # より実践的な例:消費税を計算する関数 def calculate_tax_included_price(price, tax_rate=0.10): """ 税込み価格を計算する関数 引数: price: 税抜き価格 tax_rate: 税率(デフォルトは10%) 戻り値: 税込み価格 """ tax = price * tax_rate total = price + tax return total # 使用例 price1 = calculate_tax_included_price(1000) # 税率を指定しない場合は10% print(f"1000円の税込み価格: {price1:.0f}円") price2 = calculate_tax_included_price(1000, tax_rate=0.08) # 軽減税率8% print(f"1000円の税込み価格(軽減税率): {price2:.0f}円")
以下、実行結果です。
10 + 20 = 30 1000円の税込み価格: 1100円 1000円の税込み価格(軽減税率): 1080円
デフォルト引数について説明しましょう。
tax_rate=0.10
のように=
で値を指定すると、その引数を省略したときのデフォルト値(既定値)を設定できます。
これにより、よく使う値を毎回指定する手間が省けます。
まとめ
今回は、Pythonプログラミングの第一歩として、データを扱うための「変数」、処理の流れを制御する「条件分岐」や「繰り返し」、そして処理をまとめる「関数」といった、最も基本的な文法をお話ししました。
これらの要素は、あらゆるプログラムを組み立てるための重要な部品です。
まずは今回学んだ基本をしっかりと理解し、次のステップへ進む準備をしましょう。