演習 - 加算

完了

この演習では、プログラムに含まれる値、データ型、あるデータ型の値を別のデータ型の値に変換する方法について学習します。

加算を実行するプログラムを作成する

前の演習で見せたような手法を利用することで、エンド ユーザーに 2 つの値を入力するように求め、その値を加算し、結果を表示する新しいプログラムを作成します。 その過程で新しい問題と解決策に遭遇すると、それにより、Python のしくみに関するより深い分析情報を得ることができます。

手順 1 - 新しい .py コード ファイルを作成する

次の演習用に新しいファイルを作成してみましょう。 先ほど覚えた手法を利用して新しいファイルを作成し、それに numbers.py という名前を付けます。

注意

Visual Studio Code では、[ファイル] > [新しいファイル] の順に選択してファイルを作成し、[ファイル] > [名前を付けて保存] の順に選択して名前を付けることができることを覚えておいてください。

手順 2 - コードを新しいファイルに追加する

新しい numbers.py ファイルに次のコードを入力します。

print("First Number:")
first_number = input()
print("Second Number:")
second_number = input()
sum = first_number + second_number
print(sum)

通常、このコード サンプルは前の演習で作成したものとほぼ同じです。 ただし、次のコード行を少しだけ変えました。

sum = first_number + second_number

ここで、プログラムで後に使用する計算後の値を保持する目的で "一時的変数 sum" を導入します。 言い換えると、最後のコード行は代わりに次のように記述できます。

print(first_number + second_number)

上記のような解決方法を選択した場合、sum 変数を持ち込む必要がありません。

それでは、sum 変数をなぜ作成したのでしょうか?

一時的変数でコードが読みやすくなることがあります。 この場合、最後の行のコードは、この演習の後半でさらに複雑になることがわかっているので、加算、連結、出力のすべてを 1 行のコードに済ませることで、その行が短くなり、扱いやすくできるかもしれません。

これは判断の問題であり、開発者であれば、コードを書けば書くほど、何が読みやすく見えるかというスタイルや個人的な好みがわかってきます。

Python コミュニティでは、自分自身やあなたのコードを読む他人が将来的に困らないよう、コードは読みやすくしてくださいとだけ推奨されています。 Python 開発者コミュニティの間で頻繁に語られる言葉に、"コードを書くのは一回だけだが、何回も読むものである。だから できるだけ読みやすくすること。" というものがあります。

変数に名前を付ける

変数には自由に名前を付けることができますが、変数が指すデータの説明になる名前を選ぶことをお勧めします。 ふさわしい名前を選ぶ作業は時として大変ですが、無駄ではありません。 名前はできるだけ短く、内容を可能な限り説明するものを選ぶのが理想です。 通常、1 つか 2 つの単語で間に合うはずです。

ヒント

Python のベスト プラクティスとしては、変数名にはすべて小文字を使用します。 変数の用途を正しく説明するために複数の単語が必要になる場合、アンダースコア (_) 文字で単語を区切ります。

手順 3 - コードを保存し、実行する

前に学習した手法のいずれかを使用して、プログラムを保存して実行します。 次の出力が表示されます。

First Number:
5
Second Number:
4
54

上の出力は目的のものではありません。 2 つの数値を加算して合計を出すプログラムのはずが、2 つの文字列を連結してしまったようです。

手順 4 - 問題の特定

問題は、input() 関数から数値ではなく文字列として表わされるデータが返されることです。

Python では、プログラムの値にはすべて、データの種類と機能を説明するデータ型が関連付けられます。 言い換えると、2 つの値が文字列であるため、連結することしかできません。

2 つの値で数学的演算を行う場合、両方の値を数値データ型にする必要があります。

文字列値を整数値に変換するにはどうすればよいでしょうか?また、なぜその必要があるのでしょうか?

データ型とは

データ型はあらゆるプログラミング言語に存在します。 ほとんどのプログラミング言語で、データのさまざまな種類とデータ自体に対して実行する演算の種類を表わす多様なデータ型が用意されています。 Python には、文字列、整数、浮動小数点数 (小数を含む数値データを表わすことができる) など、単純なデータ型と、値などの集合を表わす複雑なデータ型があります。

データ型はそれぞれ、プログラマーがキャリアのある時点で持っているニーズを満たす目的で存在しています。 データ型によっては、頻繁に使うものとほぼ使わないものがあります。

プログラムで使っている値のデータ型が正しくない場合、組み込み関数を利用し、目的のデータ型にそれを変換できます。 このシナリオでは、int() 関数を使用し、文字列を整数 (自然数) に変換します。 値のデータ型が正しければ、それを自由に使用できます。 たとえば、文字列データを整数データに変換した後、そのデータで加算演算を実行できます。

手順 4 - 入力を整数に変換するようにコードを修正する

次のコード サンプルと一致するようにコードを更新します。

print("First Number:")
first_number = int(input())
print("Second Number:")
second_number = int(input())
sum = first_number + second_number
print(sum)

このコード サンプルの大きな違いに注目してください。 ここでは、input() 関数の呼び出しを int() 関数の呼び出しでラップしています。 言い換えると、Python インタープリターではまず input() 関数が実行され、ユーザー入力を含む値が input() 関数から返されると、それが入力パラメーターとして int() 関数に渡され、文字列から整数に値が変換されます。

ヒント

print() メソッドは柔軟です。 文字列データ型、int データ型、float データ型、まだ説明していないその他のデータ型を表示するために使用できます。

手順 6 - コードを保存し、実行する

前に学習した手法のいずれかを使用して、プログラムを保存して実行します。 次の出力が表示されます。

First Number:
5
Second Number:
4
9

成功です。

ですが、プログラムをもう一度実行するとき、数値以外の値を指定するとどうなるでしょうか? 言い換えると、2 つの数値を入力するように求められたとき、名と姓を入力するとどうなるでしょうか?

First Number:
bob
Traceback (most recent call last):
  File "c:/python/hello/stuff.py", line 8, in <module>
    first_number = int(input())
ValueError: invalid literal for int() with base 10: 'bob'

ここでは、プログラムを再実行するとき、数値ではなく、bob という名を入力しました。 Enter を選択すると、実行時エラーが発生し、プログラムが終了します。 コンパイル時のエラーは、お客様がプログラムをエンド ユーザーに配布する前に試みるプログラムの実行および修正の際に Python コンパイラによってキャッチされるものですが、これとは異なりランタイム エラーは、ユーザーがプログラムを使用しているときに自分の責任でもないのにエラーが発生するというものです。

理想的には、まず、ユーザーが入力した値が確実に数値に変換されることをチェックしてから、データ変換を実際に実行します。 ユーザーが数値を入力していない場合は、彼らのエントリを無視して、数値を入力するようにもう一度彼らに求めることができます。 今のところ、プログラムにおける潜在的な問題があることを認識してください。 それについては、Python をより詳しく学習すると、対処できるようになります。

手順 7 - 合計値の前にラベルを表示するようにコードを修正する

次のタスクは、コンテンツの最後の行を書式設定することで、数値 9 が何を表しているかを明確にすることです。 理想的には、その数値の前に Sum のようなラベルを付けます。

コードの最後の行を、次のコード例に一致するように更新します。

print("Sum: " + sum)

このコードはうまく動作すると思いますか? なぜそうなのでしょう? または、なぜそうではないのでしょう?

手順 8 - コードを保存し、実行する

前に学習した手法のいずれかを使用して、プログラムを保存して実行します。 次の出力が表示されます。

First Number:
5
Second Number:
4
Traceback (most recent call last):
  File "c:/python/hello/numbers.py", line 11, in <module>
    print("Sum: " + first_number + second_number)
TypeError: can only concatenate str (not "int") to str

この問題は、stringint に連結することに関連しているようです。

このコードが機能しない理由は、Python によって first_number が文字列に暗黙的に変換されないことにあります。 リテラル文字列を参照し、+ を確認すると、連結を実行できるように文字列型の別の値を期待します。 整数が検出されると、対処できなくて、エラーが報告されます。

この問題を解決するには、まず加算演算を実行し、その合計を整数から文字列へと変換してから、連結を実行する必要があります。

手順 9 - 連結のために整数を文字列に変換するようにコードを修正する

この問題を解決するには、コードの最後の行を、次のコード例と一致するように変更します。

print("Sum: " + str(sum))

ここでは、str() 関数を使用して、sum 変数の値を文字列に変換します。 これにより、文字列の連結を実行すると、合計が正しく書式設定されます。

手順 10 - コードを保存し、実行する

前に学習した手法のいずれかを使用して、プログラムを保存して実行します。 次の出力が表示されます。

First Number:
5
Second Number:
4
Sum: 9

成功です。

要点

  • コードを読みやすくするための適切な変数名を選択します。
  • コードの読みやすさを向上させるのに一時変数が役に立つ場合は、それを導入することを選択します。 最善の判断を行って、読みやすくするための最適化を行います。
  • データに対して数学的演算を実行するには、まずそれを数値データ型に変換する必要があります。 整数を表す文字列値がある場合に、数値演算を実行するには、int() 関数を使用して、値を整数に変換できます。
  • int() を使用して文字列を整数に変換しようとしたが、その文字列が変換不可能な値 (名前など) である場合、エンド ユーザーにはランタイム エラーが表示されます。 ランタイム エラーは、プログラマーがデータに関する問題またはその他の潜在的なロジックの問題を事前に予測していない場合に発生します。
  • 正符号 (+) 記号を数値データ型と組み合わせて使用すると、加算が実行されます。
  • ある関数を呼び出して、その戻り値を別の関数に渡すことができます。
  • 数値を文字列に変換するには、str() 関数を使用します。