2. はじめての Python プログラム
第1章では、Python のインストール方法、対話シェル (REPL) の使い方、そして簡単なスクリプトファイルの実行方法を学びました。また、エラーとトレースバックの最初の例も見ました。ここからは、はじめての本格的な Python プログラムを書いていきます。情報を表示し、ユーザーから入力を受け取り、有意義な結果を出力するプログラムです。
この章では、ほとんどすべての Python プログラムで使う基本的な構成要素を紹介します。出力を表示するための print() 関数、コードに説明を書き込むためのコメント、データを保存するための変数、ユーザーから情報を受け取るための input() 関数です。章の終わりには、古典的な input-process-output パターンに従う、シンプルですが完結した対話的プログラムを作れるようになります。
2.1) print() 関数でテキストを表示する
print() 関数は、Python でもっとも重要なツールの 1 つです。画面にテキスト(やその他の情報)を表示し、プログラムがユーザーとやり取りできるようにします。第1章ですでに print() を簡単に見ましたが、ここではより詳しく扱います。
2.1.1) 基本的な表示
もっとも単純な使い方では、print() は引用符で囲まれたテキストを表示します。動作を確認するために、スクリプトファイルを作ってみましょう。
# hello.py
print("Hello, World!")このスクリプトを実行すると、Python は次のように表示します。
Hello, World!引用符の中にある "Hello, World!" のようなテキストは 文字列 (string) と呼ばれます。文字列は、文字(アルファベット、数字、記号、スペース)の並びで、Python はこれをテキストとして扱います。文字列については第5章でさらに詳しく学びますが、今のところは「Python でテキストを表す方法」と考えておけば大丈夫です。
表示したいテキストを引用符の中に書けば、どんな内容でも出力できます。
# greetings.py
print("Welcome to Python programming!")
print("This is your first real program.")
print("Python makes programming fun and accessible.")Output:
Welcome to Python programming!
This is your first real program.
Python makes programming fun and accessible.それぞれの print() 文が、別々の行に出力されていることに注目してください。print() を呼び出すたびに、Python は自動的に行末に改行(newline)を追加し、カーソルを次の行に移動します。
2.1.2) 複数の要素をまとめて表示する
print() 関数は、カンマで区切ることで 1 回の呼び出しで複数の要素を表示できます。
# multiple_items.py
print("Python", "is", "awesome!")
print("I", "am", "learning", "to", "code")Output:
Python is awesome!
I am learning to code要素をカンマで区切ると、print() は自動的にその間にスペースを挿入します。これにより、スペースを自分で文字列に書き足さなくても、複数のテキストを簡単に組み合わせることができます。
また、異なる種類のデータを混ぜて表示することもできます。たとえば、テキストと数値の両方を表示できます。
# mixed_output.py
print("The answer is", 42)
print("Python version", 3.12, "is powerful")Output:
The answer is 42
Python version 3.12 is powerfulPython は、表示の際に数値を自動的にテキストに変換してくれるので、今は技術的な細かい部分を気にする必要はありません。さまざまなデータ型については第3章で学びます。
2.1.3) シングルクォートとダブルクォート
Python では、文字列にシングルクォート (') とダブルクォート (") のどちらも使えます。単純なテキストであれば、どちらを使ってもまったく同じ意味になります。
# quotes.py
print("This uses double quotes")
print('This uses single quotes')
print("Both work exactly the same way")Output:
This uses double quotes
This uses single quotes
Both work exactly the same wayただし、テキストの中にアポストロフィや引用符を含める場合には、どちらのクォートを使うかが重要になります。もしテキストにアポストロフィ(シングルクォートと同じ文字)が含まれている場合は、外側にはダブルクォートを使います。
# apostrophes.py
print("It's a beautiful day!")
print("Python's syntax is clean")Output:
It's a beautiful day!
Python's syntax is cleanここでシングルクォートを使おうとすると、Python は混乱します。
# This causes an error:
print('It's a beautiful day!') # Error! Python sees three separate quotesこのエラーは、"It's" の中のアポストロフィを文字列の終わりだと Python が解釈し、"s a beautiful day!" が無効なコードとして残ってしまうために起こります。
同様に、テキストにダブルクォートを含めたい場合は、外側にシングルクォートを使います。
# quotations.py
print('She said, "Hello!"')
print('The book is called "Python Basics"')Output:
She said, "Hello!"
The book is called "Python Basics"実践的な指針: シングルクォートかダブルクォートか、どちらか 1 つのスタイルを選んで、コード全体で一貫して使うようにしましょう。多くの Python プログラマーは通常の文字列にはダブルクォートを好んで使いますが、どちらでも構いません。普段使っている方のクォート文字を文字列中に含めたいときだけ、もう一方のクォートスタイルに切り替えましょう。
2.1.4) 空行を表示する
出力を読みやすくするために、空行を挿入したい場合があります。その場合は、引数なしで print() を呼び出します。
# spacing.py
print("First section of output")
print("More information here")
print() # Empty line
print("Second section of output")
print("This is separated from the first section")Output:
First section of output
More information here
Second section of output
This is separated from the first section引数のない print() 呼び出しが空行を 1 行生成し、出力の異なるセクションを視覚的に区切ることで読みやすくしています。
2.1.5) 文字列中の特殊文字
ときどき、キーボードからそのまま入力できなかったり、Python にとって特別な意味を持つ文字を出力したいことがあります。たとえば、文字列の途中で改行を入れたい場合や、タブで揃えたい場合はどうすればよいでしょうか。Python には、バックスラッシュ (\) から始まる エスケープシーケンス (escape sequences) という特別な 2 文字の組み合わせがあり、これを使ってそうした文字を表現します。
これらのエスケープシーケンスは、特定の形式で出力を整えたいとき、たとえば複数行のメッセージを作ったり、データの列を揃えたり、Windows のファイルパスを扱ったりするときなどに、特に役立ちます。プログラムを書くにつれて、\n はとても頻繁に使うようになります。
もっともよく使われるエスケープシーケンスは \n で、これは改行(行の区切り)を表します。
# newlines.py
print("First line\nSecond line\nThird line")Output:
First line
Second line
Third line\n は、その位置で Python に「ここで新しい行に移る」よう指示します。1 回の print() 文で複数行の出力を作りたいときに便利です。
もう 1 つよく使われるエスケープシーケンスが \t で、これはタブ(水平の空白)を表します。
# tabs.py
print("Name:\tJohn")
print("Age:\t25")
print("City:\tNew York")Output:
Name: John
Age: 25
City: New York\t によって一定幅の空白が挿入され、値が列のようにきれいに揃います。
実際のバックスラッシュ自体を出力したい場合は、\\ を使います。
# backslash.py
print("The file path is C:\\Users\\Documents")Output:
The file path is C:\Users\Documentsエスケープシーケンスや文字列の扱いについては、第5章でもっと詳しく学びます。今のところは、\n が改行、\t がタブを作るものだと覚えておけば十分です。
2.2) コードを説明するためのコメント
プログラムが複雑になるにつれて、そのコードが何をしているのかを説明することが重要になってきます。これは、コードを読むかもしれない他人のためにも、将来の自分のためにも役立ちます。Python ではこの目的のために コメント (comments) を用意しており、実行時に Python はコメントを完全に無視します。
2.2.1) 1 行コメント
Python では、その行の # 記号以降のテキストはすべてコメントになります。Python は、# から行末までを無視します。
# comment_example.py
# This is a comment. Python ignores this line completely.
print("This line runs") # This comment explains the print statement
# print("This line does NOT run because it's commented out")
print("This line also runs")Output:
This line runs
This line also runs2 つ目の print() 文は行全体がコメントアウトされているため、実行されていないことがわかります。これは、コードを削除せずに一時的に無効化したいときに便利です。
コメントは単独の行として書いてもよいですし、コードの行末に書いてもかまいません。どちらのスタイルもよく使われます。
# display_info.py
# Display a welcome message to the user
print("Welcome to the program!")
print("Processing data...") # Inform the user of progress2.2.2) 良いコメントの書き方とタイミング
コメントは、コードが「何を」しているかではなく、「なぜ」それをしているのかを説明するべきです。よくないコメントの例を見てみましょう。
# Bad comment - just repeats what the code obviously does
print("Hello") # Print "Hello"このコメントは、コードから一目でわかることを繰り返しているだけなので、何の価値もありません。
より良い書き方は次のようになります。
# Good comment - explains the purpose or context
# Greet the user before requesting their information
print("Hello")このコメントは、「Hello」を表示する理由――ユーザーの情報を尋ねる前のあいさつの一環であること――を説明しています。
役に立つコメントを書くためのガイドライン:
- 目的を説明する: なぜこのコードが存在しているのか、どんな問題を解決しているのか。
- 複雑なロジックを明確にする: 一目ではわかりにくい部分があれば説明する。
- 重要な判断を記録する: なぜ別の方法ではなくこの方法を選んだのかを書き残す。
- 落とし穴を警告する: わかりにくかったり、意外な挙動をする部分を指摘する。
- 最新の状態を保つ: コードを変更したら、コメントも忘れずに更新する。
次は、効果的なコメントを付けた例です。
# temperature_converter.py
# This program converts temperatures from Fahrenheit to Celsius
# Formula: C = (F - 32) × 5/9
# Display program title
print("Temperature Converter")
print("Fahrenheit to Celsius")
print()
# We'll learn how to get user input in section 2.4
# For now, we'll use a fixed temperature value
fahrenheit = 75 # Temperature in Fahrenheit to convert
# Perform the conversion using the standard formula
# Subtract 32 first (order matters due to the formula)
celsius = (fahrenheit - 32) * 5 / 9
# Display the result
print("Temperature:", fahrenheit, "°F =", celsius, "°C")Output:
Temperature Converter
Fahrenheit to Celsius
Temperature: 75 °F = 23.88888888888889 °Cコメントが、プログラム全体の目的、使用している公式、計算ロジックの意図を説明していることに注目してください。初めてこのコードに触れる人にとって、とても理解しやすくなります。
2.2.3) 複数行コメントとドキュメンテーション文字列
長い説明を書きたいときは、複数の 1 行コメントを使うことができます。
# multi_line_comments.py
# This program demonstrates a longer explanation
# that spans multiple lines. Each line starts
# with a # symbol.
print("Program starts here")Python には、他の言語のような特別な複数行コメント構文はありません。ただし、三重引用符の文字列を使う別の方法があります。これは第19章で ドキュメンテーション文字列 (docstrings)(関数のためのドキュメント文字列)として詳しく学びますが、ここで少しだけ見ておきます。
# docstring_preview.py
"""
This is a multi-line string that can serve as a comment.
It's not technically a comment—it's a string that Python
creates but doesn't use. However, it's often used for
longer explanations at the beginning of files.
"""
print("Program starts here")今のところは、コメントには # を使うようにしてください。三重引用符の文字列とその正しい使い方については、後の章で学びます。
2.2.4) テストのためにコードをコメントアウトする
コメントは、テスト中にコードを一時的に無効化するときにも役立ちます。
# testing.py
print("This always runs")
# print("This is disabled for testing")
print("This also always runs")このテクニックは「コードをコメントアウトする」と呼ばれます。特定の行がない状態でプログラムがどう動くかを試したいが、その行を完全に削除したくはない、というときに便利です。
2.3) 変数と代入の導入(プレビュー)
プログラムは、データを保存して操作できるようになると、はるかに役に立つものになります。変数 (variables) は値を保持する名前付きの入れ物です。変数は、情報を入れておき、あとから取り出せるラベル付きの箱のようなものだと考えてください。
重要な注意: このセクションは、この章のサンプルを理解しやすくするための変数のプレビューです。変数については、第3章で、命名規則、データ型、Python が内部で変数をどのように扱うかまで含めて、より完全に学びます。ここでは、基本的な考え方と使い方に焦点を当てます。
2.3.1) 代入で変数を作る
変数は 代入演算子 (assignment operator) (=) を使って作ります。基本的な形は次のとおりです。
variable_name = value変数名は左側、値は右側に書き、= で結びつけます。
# variables_basic.py
message = "Hello, Python!"
print(message)Output:
Hello, Python!ここで何が起きているかを見てみましょう。
- Python は
messageという名前の変数を作ります。 - Python は文字列
"Hello, Python!"をその変数に保存します。 print()関数の中でmessageを使うとき、Python は保存されている値を取り出して表示します。
変数には、さまざまな種類のデータを保存できます。いくつか例を見てみましょう。
# variable_types.py
greeting = "Welcome!" # A string (text)
age = 25 # A number (integer)
price = 19.99 # A number with a decimal point (float)
is_student = True # A boolean (True or False)
print(greeting)
print(age)
print(price)
print(is_student)Output:
Welcome!
25
19.99
Trueこれらの異なるデータ型(文字列、整数、浮動小数点数、ブール値)については、第3章で学びます。今のところは、変数がさまざまな種類の情報を保持できることを理解しておけば十分です。
2.3.2) 変数が役に立つ理由
変数を使うと、コードが柔軟になり、保守もしやすくなります。次の 2 つの方法を比べてみましょう。
変数を使わない場合:
# no_variables.py
print("Welcome, John!")
print("John, your account balance is $1000")
print("Thank you for banking with us, John!")変数を使う場合:
# with_variables.py
name = "John"
balance = 1000
print("Welcome,", name + "!")
print(name, "your account balance is $", balance)
print("Thank you for banking with us,", name + "!")どちらのプログラムも似たような出力をしますが、変数を使ったバージョンには大きな利点があります。
- 更新が簡単: 名前を変更したいとき、
name = "John"の 1 行だけを直せばよく、3 箇所すべてを書き換える必要はありません。 - ミスが減る: どこか 1 箇所だけ名前をタイプミスしてしまう、といったことがなくなります。
- 柔軟性が高い: 将来的に、
nameの値の取得方法(たとえばユーザーに尋ねる)を変えることができます。
2.3.3) 変数の再代入
変数の値は、プログラムの実行中に何度でも変えることができます。これを 再代入 (reassignment) といいます。
# reassignment.py
score = 0
print("Initial score:", score)
score = 10
print("After first update:", score)
score = 25
print("After second update:", score)Output:
Initial score: 0
After first update: 10
After second update: 25変数に新しい値を代入するたびに、Python は古い値を新しい値で置き換えます。以前の値は破棄されます。
現在の値を使って新しい値を計算することもできます。
# updating_values.py
count = 5
print("Starting count:", count)
count = count + 1 # Add 1 to count
print("After adding 1:", count)
count = count + 10 # Add 10 to count
print("After adding 10:", count)Output:
Starting count: 5
After adding 1: 6
After adding 10: 16count = count + 1 というパターンは、プログラミングで非常によく使われます。「いまの count の値に 1 を足して、その結果を再び count に代入する」という意味です。この処理を短く書く表現(count += 1)については、第4章で学びます。
2.3.4) 変数名のプレビュー
Python の変数名には、いくつかのルールがあります。
- 文字、数字、アンダースコア (
_) を含めることができます。 - 先頭は文字またはアンダースコアでなければなりません(数字から始めてはいけません)。
- スペースや
@、$、%などの特殊文字は含められません。 - Python のキーワード(
print、if、forなどの予約語)は使えません。
有効な変数名の例は次のとおりです。
# valid_names.py
user_name = "Alice"
age2 = 30
_private_value = 42
totalPrice = 99.99無効な変数名の例は次のとおりです。
# These cause errors:
# 2age = 30 # Cannot start with a number
# user-name = "Alice" # Cannot contain hyphens
# total price = 99.99 # Cannot contain spaces
# print = "Hello" # Cannot use Python keywordsベストプラクティス: 変数が何を表しているのかがわかる、説明的な名前を使いましょう。a よりは user_age の方がよく、tp よりは total_price の方がわかりやすいです。命名規則については、第3章で詳しく扱います。
2.3.5) 変数でプログラムは動的になる
変数の本当の力は、プログラムをより動的にできるところにあります。
# dynamic_greeting.py
name = "Alice"
age = 28
city = "Seattle"
print("Personal Information")
print("====================")
print("Name:", name)
print("Age:", age)
print("City:", city)
print()
print("Summary:", name, "is", age, "years old and lives in", city)Output:
Personal Information
====================
Name: Alice
Age: 28
City: Seattle
Summary: Alice is 28 years old and lives in Seattleプログラムの先頭にある name、age、city の値を変更するだけで、print() 文を一切変えずに出力全体をカスタマイズできます。このように、データとロジックを分離することは、良いプログラミングの基本的な原則です。
今後について: 第3章では、変数をデータ型、型変換、命名規則、Python が内部で変数をどのように管理しているかなども含めて、より完全に学びます。今のところは、簡単なプログラムで変数を使えるだけの理解ができていれば十分です。
2.4) input() でキーボードから入力を読む
ここまでのプログラムでは、扱うデータはすべてコードの中に直接書き込まれていました。しかし、実際のプログラムは、ユーザーが入力した情報を受け取って処理することが多いです。Python の input() 関数を使うと、それが可能になります。
2.4.1) 基本的な入力
input() 関数は、プロンプト (prompt) と呼ばれるメッセージを表示し、ユーザーが何かを入力して Enter を押すまで待機します。基本形は次のとおりです。
# basic_input.py
name = input("What is your name? ")
print("Hello,", name + "!")このプログラムを実行すると、次のようになります。
What is your name? Alice
Hello, Alice!これを順を追って見てみましょう。
- Python が
input("What is your name? ")を実行します。 - Python はプロンプト
What is your name?を表示します。 - プログラムはいったん停止し、ユーザーが何かを入力するのを待ちます。
- ユーザーが
Aliceと入力して Enter を押します。 - Python は文字列
"Alice"を変数nameに保存します。 - プログラムは続行し、あいさつ文を出力します。
input() に渡しているテキストがプロンプトであり、ユーザーが入力を始める前に画面に表示される内容です。読みやすくするため、プロンプトの末尾(たとえば疑問符の後ろ)には必ずスペースを 1 つ入れるようにしましょう。ユーザーの入力がプロンプトの文字にくっついて表示されるのを防げます。
2.4.2) input() は常に文字列を返す
ここがとても重要な点ですが、input() はユーザーが数字を入力しても、必ず文字列 (string) を返します。
# input_as_string.py
age = input("How old are you? ")
print("You entered:", age)
print("The type is:", type(age))このプログラムを実行し、25 と入力すると次のようになります。
How old are you? 25
You entered: 25
The type is: <class 'str'>ユーザーは 25 と入力しましたが、Python は 25 という数値ではなく、"25" という文字列として保存しています。type() 関数がそれを確認しており、age は整数ではなく文字列 (str) であることを示しています。
これは、計算を行いたいときに問題になります。文字列のままでは、直接数値計算ができません。
# This causes an error:
age = input("How old are you? ")
next_year_age = age + 1 # Error! Can't add a number to a stringこのコードは、文字列 "25" に数値 1 を足そうとしているため、エラーになります。
2.4.3) 入力を数値に変換する
入力値を数値として使いたいときは、int()(整数)か float()(小数)で明示的に変換する必要があります。
# input_conversion.py
age_string = input("How old are you? ")
age = int(age_string) # Convert string to integer
next_year = age + 1
print("Next year, you will be", next_year, "years old")このプログラムを実行して 25 と入力すると、次のようになります。
How old are you? 25
Next year, you will be 26 years old入力と変換を 1 行にまとめることもできます。
# input_conversion_compact.py
age = int(input("How old are you? "))
next_year = age + 1
print("Next year, you will be", next_year, "years old")こちらのほうが簡潔で、実際のコードでもよく使われる書き方です。処理は内側から外側へと順番に行われます。
input("How old are you? ")がユーザーからの入力を文字列として受け取る。int(...)がその文字列を整数に変換する。- 変換された整数が
ageという変数に保存される。
小数を扱う場合は float() を使います。
# float_input.py
price = float(input("Enter the price: $"))
tax_rate = 0.08
tax = price * tax_rate
total = price + tax
print("Price: $", price)
print("Tax: $", tax)
print("Total: $", total)このプログラムを実行して 19.99 と入力すると、次のようになります。
Enter the price: $19.99
Price: $ 19.99
Tax: $ 1.5992
Total: $ 21.5892重要: ユーザーが数値として解釈できないテキストを入力した場合、Python はエラーを発生させます。たとえば、int(input("Enter a number: ")) を使っているのにユーザーが "hello" と入力すると、Python は "hello" を整数に変換できず、エラーメッセージを表示します。こうした状況をうまく処理する方法は、第27章で例外処理を学ぶときに扱います。
2.4.4) 複数の入力
プログラムがユーザーから複数の情報を受け取る必要がある場合は、input() を複数回呼び出します。
# multiple_inputs.py
print("Please enter your information:")
print()
first_name = input("First name: ")
last_name = input("Last name: ")
age = int(input("Age: "))
city = input("City: ")
print()
print("Summary")
print("=======")
print("Name:", first_name, last_name)
print("Age:", age)
print("Location:", city)Example interaction:
Please enter your information:
First name: John
Last name: Smith
Age: 30
City: Boston
Summary
=======
Name: John Smith
Age: 30
Location: Bostonプログラムがそれぞれの情報を個別に尋ねていることに注目してください。これにより、ユーザーは何を、どの順番で入力すればよいのかをはっきりと理解できます。
2.4.5) わかりやすいプロンプトを作る
良いプロンプトは、プログラムの使いやすさを大きく向上させます。いくつか指針を挙げます。
何を求めているのかを具体的に書く:
# Good prompts
name = input("Enter your full name: ")
temperature = float(input("Enter temperature in Fahrenheit: "))
quantity = int(input("How many items do you want to purchase? "))期待する形式や単位を含める:
# format_prompts.py
date = input("Enter date (MM/DD/YYYY): ")
phone = input("Enter phone number (XXX-XXX-XXXX): ")
price = float(input("Enter price in dollars (without $): "))わかりやすく、親しみやすい言葉を使う:
# friendly_prompts.py
print("Welcome to the Temperature Converter!")
print()
temp = float(input("Please enter a temperature in Fahrenheit: "))明確なプロンプトは、ユーザーの混乱を減らし、プログラムをよりプロフェッショナルに見せてくれます。
2.5) シンプルな Input-Process-Output プログラム
多くのプログラムは、Input-Process-Output (IPO) と呼ばれる共通のパターンに従っています。
- Input: ユーザーや他のソースからデータを取得する。
- Process: データに対して計算や変換を行う。
- Output: 結果を表示する。
このパターンは非常に基本的なもので、プログラミングを学んでいく過程で、数え切れないほど多くのプログラムで使うことになります。いくつかの完結した例を通して、このパターンを見ていきましょう。
2.5.1) 例: 温度変換プログラム
まず、華氏 (Fahrenheit) を摂氏 (Celsius) に変換する完結したプログラムを作ってみましょう。
# temperature_converter.py
# This program converts a temperature from Fahrenheit to Celsius
# Formula: C = (F - 32) × 5/9
print("Temperature Converter")
print("Fahrenheit to Celsius")
print("=" * 30) # Print a line of equal signs
print()
# INPUT: Get temperature from user
fahrenheit = float(input("Enter temperature in Fahrenheit: "))
# PROCESS: Convert using the formula
celsius = (fahrenheit - 32) * 5 / 9
# OUTPUT: Display the result
print()
print("Result:", fahrenheit, "°F =", celsius, "°C")Example interaction:
Temperature Converter
Fahrenheit to Celsius
==============================
Enter temperature in Fahrenheit: 75
Result: 75.0 °F = 23.88888888888889 °Cこのプログラムが、明確に IPO パターンに従っていることに注目してください。
- Input: 華氏温度を取得する。
- Process: 変換公式を適用する。
- Output: 摂氏での結果を表示する。
コード中のコメントが、この 3 つのセクションをはっきりと示しており、プログラムの構造がわかりやすくなっています。
2.5.2) 例: 長方形の面積計算機
次は、長方形の面積を計算する IPO の例です。
# rectangle_area.py
# Calculate the area of a rectangle
# Formula: Area = length × width
print("Rectangle Area Calculator")
print("=" * 30)
print()
# INPUT: Get dimensions from user
length = float(input("Enter the length: "))
width = float(input("Enter the width: "))
# PROCESS: Calculate area
area = length * width
# OUTPUT: Display the result
print()
print("A rectangle with length", length, "and width", width)
print("has an area of", area, "square units")Example interaction:
Rectangle Area Calculator
==============================
Enter the length: 5.5
Enter the width: 3.2
A rectangle with length 5.5 and width 3.2
has an area of 17.6 square units2.5.3) 例: ショッピング合計金額計算機
次の例では、税金を含めたショッピングの合計金額を計算します。
# shopping_total.py
# Calculate total cost including tax
print("Shopping Total Calculator")
print("=" * 30)
print()
# INPUT: Get price and tax rate
price = float(input("Enter item price: $"))
tax_rate = float(input("Enter tax rate (as decimal, e.g., 0.08 for 8%): "))
# PROCESS: Calculate tax and total
tax_amount = price * tax_rate
total = price + tax_amount
# OUTPUT: Display itemized breakdown
# Note: Comma in print() adds a space after $
print()
print("Purchase Summary")
print("-" * 30)
print("Item price: $", price)
print("Tax rate: ", tax_rate * 100, "%")
print("Tax amount: $", tax_amount)
print("-" * 30)
print("Total: $", total)Example interaction:
Shopping Total Calculator
==============================
Enter item price: $49.99
Enter tax rate (as decimal, e.g., 0.08 for 8%): 0.08
Purchase Summary
------------------------------
Item price: $ 49.99
Tax rate: 8.0 %
Tax amount: $ 3.9992
------------------------------
Total: $ 53.98922.6) 簡単なエラーメッセージを読んで行う基本的なデバッグ
熟練したプログラマーであっても、ミスをすることはあります。エラーメッセージを読み、理解することを学ぶのは、膨大な時間を節約してくれる重要なスキルです。Python のエラーメッセージは実はとても親切で、何がどこでおかしくなったのかを教えてくれます。
「error message」と「traceback」という用語は関連していますが、少し意味が異なります。traceback とは、エラーが起きたときに Python が表示する完全なレポートで、エラーの種類、説明、そのエラーに至るまでのコードの流れが含まれています。error message は、その traceback の最後の行で、何が間違っていたかを説明するものです。日常会話の中では、プログラマーは traceback 全体を指して「error message」と呼ぶこともよくあります。
2.6.1) エラーメッセージを理解する
Python がエラーに遭遇すると、何が起きたかを詳しく説明する traceback を表示します。簡単な例を見てみましょう。
# error_example.py
print("Starting the program")
print("This line works fine"
print("This line might not be reached")これを実行しようとすると、Python は次のように表示します。
File "error_example.py", line 2
print("This line works fine"
^
SyntaxError: '(' was never closedこのエラーメッセージが何を伝えているのかを分解してみましょう。
- ファイル名:
error_example.py– エラーが発生したファイル。 - 行番号:
line 2– Python が問題を検出した位置。 - コード片: 問題のある行を表示し、
^で Python が異常に気づいた場所を指し示しています。 - エラーの種類:
SyntaxError– どのような種類のエラーなのか。 - 説明:
'(' was never closed– 人間向けの説明文。
このエラーは、2 行目で閉じかっこを付け忘れたことが原因です。Python は、次の行も同じ print() 文の一部だと解釈しようとして混乱してしまいました。
2.6.2) 初心者がよく遭遇するエラーの種類
ここでは、初心者が特によく出会うエラーと、その直し方を見ていきます。
SyntaxError: Invalid Syntax
これは初心者にもっとも多いエラーです。Python がコードを、Python の文法ルールに従うものとして理解できないときに発生します。
コロンの付け忘れ:
# missing_colon.py
name = input("What is your name? ")
if name == "Alice" # Missing colon
print("Hello, Alice!")Error:
File "missing_colon.py", line 2
if name == "Alice"
^
SyntaxError: expected ':'注意: ここでは if 文の例を出しましたが、if についてはまだ学んでいません。第8章で扱います。この例は、どのようなエラーが表示されるかを示すためのものです。
クォートの不一致:
# mismatched_quotes.py
message = "Hello, world!'
print(message)Error:
File "mismatched_quotes.py", line 1
message = "Hello, world!'
^
SyntaxError: unterminated string literal (detected at line 1)文字列をダブルクォート (") で始めておきながら、シングルクォート (') で終わらせているために発生するエラーです。Python は、両端に同じ種類のクォートがあることを期待します。
NameError: Name Not Defined
このエラーは、存在しない変数を使おうとしたときに発生します。
# name_error.py
print("Starting calculation")
result = total + 10 # 'total' was never created
print(result)Error:
Traceback (most recent call last):
File "name_error.py", line 2, in <module>
result = total + 10
^^^^^
NameError: name 'total' is not definedPython は、total という名前のものを知らないと教えています。total という変数が一度も作られていないためです。解決策は、その変数を使う前に定義することです。
# name_error_fixed.py
print("Starting calculation")
total = 0 # Define the variable first
result = total + 10
print(result)NameError のよくある原因は次のとおりです。
- 変数名のタイプミス(
totlaと書いてしまうなど)。 - 変数に値を代入する前に使ってしまう。
- そもそも変数を作るのを忘れる。
TypeError: Unsupported Operand Type(s)
このエラーは、互換性のない型同士で演算をしようとしたときに発生します。
# type_error.py
age = input("How old are you? ")
next_year = age + 1 # Can't add a number to a string
print("Next year:", next_year)Error:
Traceback (most recent call last):
File "type_error.py", line 2, in <module>
next_year = age + 1
~~~~^~~
TypeError: can only concatenate str (not "int") to strPython は age が文字列(input() が文字列を返すため)であること、そして文字列に数値を足すことはできないことを伝えています。解決策は、入力値を整数に変換することです。
# type_error_fixed.py
age = int(input("How old are you? ")) # Convert to integer
next_year = age + 1
print("Next year:", next_year)ValueError: Invalid Literal
このエラーは、文字列を数値に変換しようとしたものの、その文字列が有効な数値表現ではないときに発生します。
# value_error.py
age = int(input("How old are you? "))
print("You are", age, "years old")ここでユーザーが数字ではなくテキストを入力すると、次のようになります。
How old are you? twenty
Traceback (most recent call last):
File "value_error.py", line 1, in <module>
age = int(input("How old are you? "))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'Python は、文字列 "twenty" を整数に変換できないと伝えています。ユーザーは 20 のような数字を入力する必要があります。
重要: 現時点では、ユーザーが不正な入力をすると、プログラムはエラーでクラッシュします。これは初心者向けプログラムとしては普通の挙動です。第27章では、例外処理を使ってこうした状況をうまく処理し、プログラムがエラーから回復して「もう一度入力してください」と促せるようにする方法を学びます。
2.6.3) トレースバックを丁寧に読む
エラーが起きると、Python はコードをさかのぼる traceback を表示します。簡単なプログラムでは、traceback も短くなります。
# simple_traceback.py
print("Starting program")
name = input("Enter your name: ")
age = int(input("Enter your age: "))
print("Hello,", name)
print("Next year you'll be", age + 1)ここで、ユーザーが年齢に不正な入力をすると次のようになります。
Starting program
Enter your name: Alice
Enter your age: abc
Traceback (most recent call last):
File "simple_traceback.py", line 3, in <module>
age = int(input("Enter your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'traceback には次の情報が含まれています。
- エラーが起きたファイル名と行番号。
- 問題を引き起こしたコードの 1 行。
- エラーの種類と説明。
読み方のコツ: traceback は、下から上に向かって読むようにしましょう。最後の行が「何が」間違っていたのかを教えてくれます。その上の行は、「どこで」そのエラーが起きたのかを示しています。
2.6.4) よく使うデバッグの戦略
エラーに遭遇したときは、次のステップに沿って対処してみてください。
1. エラーメッセージをよく読む
焦らないでください。エラーメッセージはあなたを助けようとしています。最後まできちんと読み、何を意味しているのか考えてみましょう。
2. 行番号を確認する
エラーメッセージには、Python が問題だと判断した行番号が表示されます。ただし、実際のミスはその 1 行前にあることもあります。たとえば、2 行目の閉じかっこを忘れると、Python は 3 行目を読んだときに初めて異常に気づくかもしれません。
3. よくあるミスをチェックする
- クォートの付け忘れや不一致。
- 括弧や角括弧の閉じ忘れ。
- コロンの付け忘れ(
if、for、whileなどについては後の章で学びます)。 - 変数名のタイプミス。
- 入力値を数値に変換し忘れている。
4. print() で値を確認する
何が原因かわからない場合は、print() 文を追加して変数の中身を確認してみましょう。
# debugging_with_print.py
price = input("Enter price: ")
print("DEBUG: price =", price, "type =", type(price)) # Debugging line
tax = price * 0.08 # This will cause an error
print("Tax:", tax)デバッグ用の行が、price が数値ではなく文字列であることを示してくれます。これで問題の所在がわかります。
5. コードをコメントアウトして問題箇所を絞り込む
複数行のコードがあり、どの行がエラーを起こしているかわからない場合は、いくつかの行をコメントアウトして、エラーが消えるかどうかを試します。
# isolating_error.py
name = input("Enter name: ")
# age = int(input("Enter age: ")) # Commented out for testing
# city = input("Enter city: ") # Commented out for testing
print("Name:", name)エラーがなくなったら、コメントアウトした行のどこかに問題があることがわかります。
6. シンプルな版から始める
プログラムがうまく動かないときは、できるだけ簡単な形にしてみましょう。
# simplified_version.py
# Start with just the basic structure
print("Program starting")
# Add one feature at a time and testシンプルな版が動くことを確認したら、機能を 1 つずつ追加し、そのたびに動作をテストします。
2.6.5) エラーを未然に防ぐ
デバッグは重要ですが、そもそもエラーが起きないようにすることはさらに望ましいことです。
少しずつコードを書く
プログラム全体を書き上げてから、初めて実行する、という方法は避けてください。数行書いたら実行して、その部分が動くことを確認し、次の数行を書く……というふうに進めましょう。そうすれば、エラーが出たとき、「直前に追加した部分」に問題があることがわかります。
# incremental_development.py
# Step 1: Get input and test
name = input("Enter name: ")
print("DEBUG: Got name:", name)
# Step 2: Add more input and test
# age = int(input("Enter age: "))
# print("DEBUG: Got age:", age)
# Step 3: Add processing and test
# ... and so on意味のある変数名を使う
わかりやすい変数名は、ミスを減らすのに役立ちます。
# Clear variable names make errors less likely
user_age = int(input("Enter your age: "))
next_year_age = user_age + 1ロジックをコメントで説明する
コメントを書くことで、「コードがこう動くべきだ」という自分の考えが明確になります。すると、実際の動きと違っているときに気づきやすくなります。
# temperature_with_comments.py
# Get temperature in Fahrenheit from user
fahrenheit = float(input("Enter temperature in Fahrenheit: "))
# Convert to Celsius using the standard formula: C = (F - 32) × 5/9
celsius = (fahrenheit - 32) * 5 / 9
# Display the result
print(fahrenheit, "°F =", celsius, "°C")さまざまな入力でテストする
プログラムを 1 回だけテストして終わりにしてはいけません。次のような、いろいろな入力を試してみましょう。
- 普通の値:
25、100 - ゼロ:
0 - 負の数:
-10 - 小数:
3.14 - 非常に大きな数:
1000000
こうすることで、ユーザーが遭遇する前に問題を発見できます。
2.6.6) 助けを求めるタイミング
ときには、自力では解決できないエラーに出会うこともあります。誰かに助けを求める前に、次のことを試してください。
- エラーメッセージをよく読む – 何が書いてあるのか、きちんと理解しようとします。
- エラーメッセージを検索する – エラー文(変数名など固有の部分を除いて)をコピーしてインターネットで検索してみましょう。同じエラーを経験し、解決した人がたくさんいます。
- コードを丁寧に確認する – タイプミス、句読点の抜け、よくあるミスがないか見直します。
- 最小限の再現コードを作る – エラーが再現する最低限のコードに削ってみます。
それでも他の人に助けを求めるときは、次の情報を提供するとよいです。
- 完全なエラーメッセージ。
- エラーを生むコード。
- 何が起きてほしかったのか(期待した挙動)。
- 実際には何が起きたのか。
- すでに試した対処方法。
忘れないでほしいこと: エラーはプログラミングのごく普通の一部です。初心者からエキスパートまで、すべてのプログラマーが毎日のようにエラーに出会っています。違いは、経験豊富なプログラマーはエラーメッセージを素早く読み取り、よくある解決策を知っているという点だけです。こうしたスキルは、練習によって必ず身に付きます。
ここまでで、Python プログラミングの基本的な構成要素を学びました。print() で出力を表示し、コメントでコードを説明し、変数にデータを保存し、input() でユーザー入力を受け取り、input-process-output パターンに従ってプログラムを構成し、簡単なエラーをデバッグする方法です。
これらの概念は、この先 Python で学ぶすべての内容の土台となります。次の章では、変数をさらに掘り下げ、Python の基本的なデータ型を調べていきます。Python がさまざまな種類の情報をどのように保存し、操作しているのかを、より完全に理解できるようになります。
この章の重要なポイント:
print()を使って、ユーザーにテキストやその他の情報を表示する。- コメント(
#)でコードを説明し、自分の考えを記録する。 - 代入 (
=) を使ってデータを変数に保存する。 input()でユーザー入力を受け取り、必要に応じて数値に変換する。- input-process-output パターンでプログラムを構造化する。
- エラーメッセージを丁寧に読み、問題解決に役立てる。
- コードは少しずつ書いて頻繁にテストし、早い段階でエラーを見つける。
これらのスキルを身につけたことで、シンプルながらも完結した対話的プログラムを書くことができるようになりました。今後学習を進めるにつれて、ここで学んだ基礎の上に、より高度なアプリケーションを積み上げていくことになります。