def get_number(prompt):
while True:
try:
return float(input(prompt))
except ValueError:
print("有効な数値を入力してください。")
def get_operator():
valid_operators = ['+', '-', '*', '/']
while True:
operator = input("演算子を入力してください (+, -, *, /): ")
if operator in valid_operators:
return operator
print("有効な演算子を入力してください。")
def calculate(num1, operator, num2):
try:
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
if num2 == 0:
raise ZeroDivisionError("ゼロによる除算はできません。")
return num1 / num2
except ZeroDivisionError as e:
print(f"エラー: {e}")
return None
def continue_calculation():
while True:
answer = input("続けて計算しますか? (y/n): ").lower()
if answer in ['y', 'n']:
return answer == 'y'
print("yまたはnを入力してください。")
def main():
print("=== 簡単な電卓アプリ ===")
while True:
# 数値と演算子の入力
num1 = get_number("1つ目の数値を入力してください: ")
operator = get_operator()
num2 = get_number("2つ目の数値を入力してください: ")
# 計算の実行
result = calculate(num1, operator, num2)
# 結果の表示
if result is not None:
print(f"\n{num1} {operator} {num2} = {result}\n")
# 続けるかどうかの確認
if not continue_calculation():
break
print("電卓アプリを終了します。")
if __name__ == "__main__":
main()
get_number の詳細解説get_numberは関数です。**def** とは、JavaScriptで言う function に相当します。prompt)と変数の概念prompt は、**変数であり引数**です。prompt は、外部からのデータの受け渡しに使われる、**ローカル変数の一種である引数**です。promptは変数名でもあり引数名でもあります。while True** により、成功するまで**無限ループ**とし、例外処理(try)を記述します。except ValueError:
ValueError)であれば、通常は強制終了されますが、例外処理を施しておりますので、強制終了せずに回復処理を実行し、『有効な数値を入力してください』と出力し、再入力を促します。ValueError以外のエラー**であれば、プログラムを強制終了させるようにします。get_number の関数は終了し、prompt はローカル変数であり、ローカル変数の一種である引数ですので、次の関数からは適用されませんが、値は別の関数に渡すことが可能です。var、let、const という用語が使われますが、Pythonでは使用しません。var や let は、Pythonでは特別なキーワードを使わずに = で変数を定義することに相当し、その変数の有効範囲(スコープ)は**字下げによって定義された関数(def)の内部に限定されます**。const(定数)は、Pythonでは変数名を全て大文字にすることによって慣習的に定義します。get_operator() の詳細解説get_operator)def get_operator():
valid_operators = ['+', '-', '*', '/']
while True:
operator = input("演算子を入力してください (+, -, *, /): ")
if operator in valid_operators:
return operator
print("有効な演算子を入力してください。")
calculate(num1, operator, num2) の詳細解説calculate)def calculate(num1, operator, num2):
try:
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
if num2 == 0:
raise ZeroDivisionError("ゼロによる除算はできません。")
return num1 / num2
except ZeroDivisionError as e:
print(f"エラー: {e}")
return None
num1, operator, num2。これらはローカル変数です。以前の関数から値が渡されます。try...except): raise)**させます。continue_calculation() の詳細解説continue_calculation)def continue_calculation():
while True:
answer = input("続けて計算しますか? (y/n): ").lower()
if answer in ['y', 'n']:
return answer == 'y'
print("yまたはnを入力してください。")
main() と実行ブロック の詳細解説main および実行ブロック)def main():
print("=== 簡単な電卓アプリ ===")
while True:
# 数値と演算子の入力
num1 = get_number("1つ目の数値を入力してください: ")
operator = get_operator()
num2 = get_number("2つ目の数値を入力してください: ")
# 計算の実行
result = calculate(num1, operator, num2)
# 結果の表示
if result is not None:
print(f"\n{num1} {operator} {num2} = {result}\n")
# 続けるかどうかの確認
if not continue_calculation():
break
print("電卓アプリを終了します。")
if __name__ == "__main__":
main()
main() 関数:**
if __name__ == "__main__"::**
'hello', 100)input, print, `float`など、Pythonに標準で備わっている関数です。()**が使われます。メソッドの呼び出しには**ドット .**が使われます。
Def get_number(prompt):
while True:
try:
return float(input(prompt))
except ValueError:
print("有効な数値を入力してください。")
get_numberという関数を定義する。関数とは、特定の処理をひとまとまりにしたものである。この関数(定義)は、計算に使用できる数値をユーザーからプログラムがクラッシュ(強制終了)しないように安全に受けとる事を保証するために設計されている関数である。ちなみに、計算に使用できる数値をユーザーから安全に受けとることを保証するために設計されていない関数は、プログラミングにおいて一般的である。()内に記されているpromptは、変数であり引数である。変数とは、定数(値の変更不可)とは違い、値が変更可能な箱のようなものである。引数とは、関数が特定の処理を行うために必要な材料や情報を関数の外側から内部へ持ち込む役割を持つ。値とは、文字列、数値、真偽値(True、False)、コレクションなど、あらゆる種類のデータそのものを指す。また、ここでいうpromptはローカル変数の一種である引数であり、外部からのデータの受け渡しに使われる。ローカル変数なので、次に指定したコードブロック内でしか適用されないが、ローカル変数内の値は別の関数へ渡す事ができる。そして、ここでいうpromptは変数名でも引数名でもある。ちなみに、defとは、Javascriptで言うfunctionに相当する。では次に、成功するまで無限ループとし、例外処理(try)を記述する。例外処理とは、プログラムの実行中に発生する予期せぬエラー(例外)をキャッチし、プログラムが突然クラッシュ(強制終了)するのを防ぐための仕組みであり、成功しなくても強制終了されずに回復処理が施される。ここでいうfloatは、データ型としてではなく、関数として扱う。ユーザーからデータを取得し、その入力されたユーザーから入力された文字列が有効な数値であれば、浮動小数点数に変換し関数を終了し、次の処理に向かう。無効な数値であれば通常は強制終了されるが、例外処理を施しているので、強制終了せずに回復処理を実行し、『有効な数値を入力してください』と出力し、再入力を促せ。また、ValueError(ここでは無効な数値)以外のエラーであれば、プログラムを強制終了させよ。以降は字下げを行うので、get_numberの関数は終了し、promptはローカル変数であり、ローカル変数の一種である引数なので、次の関数からは適用されないが、値は別の関数に渡す事はできる。ちなみに、Javascriptではvar、let、constという用語が使われるが、Pythonでは使わない。JavaScriptでいう var や let は、Pythonでは特別なキーワードを使わずに = で変数を定義することに相当し、その変数の有効範囲(スコープ)は字下げによって定義された関数(def)の内部に限定される。const(定数)は、Pythonでは変数名を全て大文字にする事によって定義する。
def get_operator():
valid_operators = ['+', '-', '*', '/']
while True:
operator = input("演算子を入力してください (+, -, *, /): ")
if operator in valid_operators:
return operator
print("有効な演算子を入力してください。")
get_operator() 関数は、リストに定義された特定の文字列の中から、ユーザーの入力を選ばせるという目的の関数であり、ローカル変数の外側にある値を外側に出力する役割を持っている。この関数の()内には何も記されてないので、この関数に引数は無い。リストは、+,-,*,/,とし、これをvalid_operatorsに代入し有効な文字列とし、有効な演算子として扱う。そして、演算子を入力してください (+, -, *, /):と出力し、ユーザーから入力を求める。ユーザーからの入力されたものを、operatorと名付けた変数に代入する。operatorに格納された文字列がvalid_operatorsのリストの要素の中に含まれているならば、その値を呼び出し元に返却し、この関数を終了させる。operatorの中に無いのであれば、有効な演算子を入力してください。と画面に出力し、ループする。ちなみに、valid_operatorsとoperatorはローカル変数なので、適用されるのはこの関数内(ローカルスコープ)だけであるが、値は別の関数に渡す事はできる。
def calculate(num1, operator, num2):
try:
if operator == '+':
return num1 + num2
elif operator == '-':
return num1 - num2
elif operator == '*':
return num1 * num2
elif operator == '/':
if num2 == 0:
raise ZeroDivisionError("ゼロによる除算はできません。")
return num1 / num2
except ZeroDivisionError as e:
print(f"エラー: {e}")
return None
calculateという関数を定義する。calculateは、四則計算をする関数である。多くの関数は計算を実行する前にエラーチェックや例外処理は組み込んでいないが、calculate()はプログラムがクラッシュ(強制終了)しないように安全に計算を実行する役割を担っている。()内に記されたnum1,operator,num2,は、引数であり、ローカル変数である。ローカル変数なので、この関数内でしかこれらの変数は適用されない。numは数値を表す変数としてとてもよく使われる。以前の関数内から、operatorから値を呼び出し、get_operator() から return された値がこの関数の引数 operator に渡された。ちなみに引数は、関数が特定の処理を行うために必要な材料や情報を関数の外側から内部へ持ち込む役割を持つ。では次に例外処理を記述する。例外処理とは、プログラムの実行中に発生する予期せぬエラー(例外)をキャッチし、プログラムが突然クラッシュ(強制終了)するのを防ぐための仕組みであり、成功しなくても強制終了されずに回復処理が施される。==は比較演算子であり、左辺の値と右辺の値が等しいかどうかを比較する。operatorと+が等しいのであれば、num1+num2の値を返す。そうではなく-であれば、num1-num2の値を返す。そうではなく*であれば、num1*num2の値を返す。そうではなく、もし operator が / と等しいならば、num2 が 0 であるかチェックせよ(仮にnum2が0であるかどうかをチェックせずnum2が0であれば、ZeroDivisionErrorが発生し、プログラムがクラッシュしてしまう)。もし 0 ならば、『ゼロによる除算はできません。』というメッセージとともに意図的に ZeroDivisionError を発生させ(raize)、except ブロックに処理を移せ。exceptは、tryブロック内でエラーが発生すると、そのエラーを捕捉し、exceptの行にジャンプする。except ブロックとは、except ZeroDivisionError as e: の行から、その関数内の字下げされた部分の終わりまでを指し、プログラムのクラッシュ(強制終了)を防ぎ、安全に回復処理を実行する役割がある。asとは、発生した例外オブジェクトに一時的な変数名を割り当てるものであり、eは変数である。例外オブジェクトとは、Pythonなどのオブジェクト指向言語において、プログラムの実行中に発生したエラーや予期せぬ事態に関する情報すべてをひとまとめにしたデータ構造(インスタンス)のことである。例外オブジェクトをキャッチするための変数としてはeが一般的で広く使われる。もし 0 でなければ、num1 を num2 で割った値を返却する。もしraizeで例外が発生した場合は、exceptブロックに処理が移り、エラーゼロによる除算はできません。と画面に出力する。ちなみに、print(f"エラー: {e}")ではなく、print("エラー: {e}")とfが付いてないと、画面にエラー: {e}と出力されてしまう。return Noneは、値を返さない事を明示的に示す関数であるが、この場合はreturn Noneと記さなくてもプログラムの動作上には問題ない。ただそう記す事によって、コードの可読性や意図の明確さを高める事ができる。
def continue_calculation():
while True:
answer = input("続けて計算しますか? (y/n): ").lower()
if answer in ['y', 'n']:
return answer == 'y'
print("yまたはnを入力してください。")
continue_calculationという関数を定義する。continue_calculationは、有効な入力を得られるまで処理を繰り返す関数である。続けて計算しますか?(y/n)と画面に出力し、ユーザーに入力を求める。(y/n)は()で括られているが、これは視認性を高めるためのものどあり、()で括ってなくても、プログラムの動作上は問題無い。lower()とは文字列メソッドであり、文字列に含まれる全てアルファベットを小文字に変換する役割がある。文字列とは、プログラミングにおいて文字の並びを扱うためのデータ型であり、文字列とはテキスト型である。データ型には文字列の他に、数値型、真偽値型、コレクション型などがある。メソッドとは、特定のデータ型に専用の機能や処理を与えるものである。これをanswerと名付けた変数(ローカル変数)に代入する。answerの変数内の値とyが完全一致であればTrueを返し、そうでなければFalseを返す。yと入力されたら(Trueであれば)この関数は終了し、計算を続ける。nと入力されたら(Falseであれば)計算は終了する。どちらでもないのであれば、yまたはnを入力してください。と画面に出力する。
ちなみに、
if answer == 'y':
return True
elif answer == 'n':
return False
このような記し方もあるが、
if answer in ['y', 'n']:
return answer == 'y'
こちらの方が簡潔で好まれる。
def main():
print("=== 簡単な電卓アプリ ===")
この関数はmainという関数で、引数無しで定義する。mainは、プログラムの開始点(エントリポイント)として慣習的に使われる。このmain関数が呼び出されたら、=== 簡単な電卓アプリ ===と画面に出力させるコードである。
while True:
# 数値と演算子の入力
num1 = get_number("1つ目の数値を入力してください: ")
operator = get_operator()
num2 = get_number("2つ目の数値を入力してください: ")
無限ループの開始(プログラムが終了するまでこの処理を繰り返す)。関数名()とすれば、コード内にある関数を呼び出す事ができる。get_numberという関数を呼び出し、1つ目の数値を入力してください:と画面に出力し、ユーザーから値の入力を求め、num1という変数に代入。次に、get_operatorという関数を呼び出し、ユーザーから値の入力を求め、operatorという変数に代入。次にget_numberという関数を呼び出し、2つ目の数値を入力してください:と画面に出力し、ユーザーから値の入力を求め、num2という変数に代入。定数だと新しい値は代入できないが、変数なので新しい値が代入できる。
result = calculate(num1, operator, num2)
事前に定義していたcalculateという関数を呼び出し、num1,operator, num2の引数の値をcalculateという関数に渡し、計算を実行する。その戻り値(計算結果)をresultという変数に代入する。
if result is not None:
print(f"\n{num1} {operator} {num2} = {result}\n")
resultという変数の値がNoneでなければ、変数に格納された値を画面に出力する。fは、文字列リテラルのプレフィックス(接頭辞)であり、変数に格納された値を置き換えるものであり、変数を文字列リテラルにフォーマットする(形式を整える)。これをフォーマット済文字列リテラルといい、printという組み込み関数でフォーマット済文字列を画面に出力する。\nはエスケープシーケンスであり、改行を意味する。エスケープシーケンスは必ずバックスラッシュ(\)からはじまる。
fを使わない場合、
if result is not None:
# プレースホルダー {} を使い、.format()で順番に値を埋め込む
print("\n{} {} {} = {}\n".format(num1, operator, num2, result))
if result is not None:
# 数値変数 (num1, num2, result) を str() 関数で文字列に変換する必要がある
output = "\n" + str(num1) + " " + operator + " " + str(num2) + " = " + str(result) + "\n"
print(output)
といった書き方になる。
# 仮にprintがないとして、画面出力機能を自作する場合
def display_on_screen(data_to_show):
# ここに、OSや実行環境に対して「このデータを画面に表示せよ」
# という命令を実行するための、非常に低レベルな処理を記述する
# ... (非常に複雑なコードになる) ...
pass
if not continue_calculation():
break
continue_calculation()関数は、続けて計算しますか? (y/n): と画面に出力し、ユーザーに入力を求め、yと入力すればTrue、nと入力すればFalseを返す関数である。だが、if not〜なので、ここでは真偽値が逆転し、yだとFalse、nだとTrueが返される。ユーザーが 'n' と入力した結果、if の条件全体が True となり、ループが終了される。yだとFalseが返され、次の処理へ向かう。
print("電卓アプリを終了します。")
電卓アプリを終了します。と画面に出力する。
if __name__ == "__main__":
main()
このファイルがインポートされても、
このファイルが勝手に起動されないためにこのコードを記す。
という事でよいですか。
Pythonの場合、シングルクォート(')とダブルクォート(")は、文字列リテラルであり、固定のテキスト値を表現する。数字が囲われている場合、その数字は文字列として扱われる。
リテラルは固定された値、
変数は固定されていない値、
定数は変数の一種でありリテラルとは区別される。
Input、print、floatは、
組み込み関数である。
関数やメソッドは、
必ず()が使われる。
メソッドの呼び出しには、
.が必ず使われる。