標準入力・標準出力と戻り値
一行の入力を整数へ変換し、個数から合計を求めます。同じ合計を表示する関数と返す関数を使い、後の計算へ渡る値を確認します。
説明
入力、画面への表示、関数が返す値は、それぞれデータの通り道が違います。数字を読み込んでも文字列のままなら、数値計算とは異なる動作になります。
一行の入力を整数へ変換し、個数から合計を求めます。同じ合計を表示する関数と返す関数を使い、後の計算へ渡る値を確認します。
1一行の入力を用意
この演習の標準入力には3と改行を用意します。StringIOは文字列を読み取り元として扱うための道具です。
import io, sys入力元を用意する機能; sys.stdin = io.StringIO("3\n")一行の入力データ; raw = input()標準入力から読む; print(repr(raw), type(raw).__name__)表記と型を確認input()は末尾の改行を除いた文字列を返すので、rawは整数3ではなく文字列'3'です。reprは引用符などを含めた表現、typeは値の型を調べます。
2文字列のまま演算する
読み込んだrawを2倍するとどうなるか確認します。
raw * 2文字列を2回繰り返す結果は'33'で、文字列の反復になりました。入力が数字に見えても、自動で整数の加算や乗算になるわけではありません。
3個数へ変換する
整数へ変換した結果をquantityに置き、元のrawと並べます。
quantity = int(raw)入力を整数へ変換; print(quantity * 2, raw, type(quantity).__name__)計算結果・元の入力・型数値計算の結果は6です。int(raw)は整数を返しますが、rawの文字列をその場で整数へ書き換える処理ではありません。以降はquantityを数量として使います。
4表示する関数を作る
価格120円の合計を画面へ出す関数を定義します。インデントした行が関数の本体です。
def show_total(n):引数nを受け取る関数
print(n * 120)合計を画面へ出す定義しただけでは合計は表示されません。関数を呼び出したときにprintが動きます。この定義にはreturnがないため、呼出元へ返す値はNoneになります。
5表示された数と受け取った値
関数呼出しの結果をshownへ代入し、その後shownの内容を表示します。
shown = show_total(quantity)表示する関数を呼び出す; print("戻り値:", shown)呼出元が受け取った値最初の360は関数内部のprintが出した文字です。shownに入った値はNoneであり、360ではありません。画面へ出た数が、そのまま式の値になるとは限りません。
6計算結果を返す関数
今度はprintの代わりにreturnで合計を返します。
def calculate_total(n):同じ引数を持つ関数
return n * 120合計を呼出元へ返すreturnは呼出元へ値を渡して関数を終了します。この関数は内部で画面表示を行わず、呼出元が戻り値を計算や表示へ使えます。
7戻り値を次の計算へ渡す
合計を受け取って送料50円を足します。
total = calculate_total(quantity)合計の戻り値を受け取る; payable = total + 50戻り値を次の式で使用; print(total, payable)呼出元で表示360を値として受け取り、410を求められました。表示する関数と返す関数は、同じ360を扱っていても後続処理へ渡せる値が違います。
8表示だけの戻り値で計算した場合
先ほどのshownを同じように計算へ使います。
shown + 50Noneを含む加算TypeErrorはNoneと整数を加算できないことを示します。shownを作った呼出しへ戻ると、関数は表示だけを行っていました。エラーが出た足し算だけでなく、値を渡してきた処理を確認します。
まとめ
input()の戻り値は文字列で、数量として使うときは変換します。
printは出力先へ表示し、returnは呼出元の計算へ値を渡します。
操作履歴と解説を振り返れます。
Python 3
import io, sys; sys.stdin = io.StringIO("3\n"); raw = input(); print(repr(raw), type(raw).__name__)'3' str
raw * 2'33'
quantity = int(raw); print(quantity * 2, raw, type(quantity).__name__)6 3 int
def show_total(n):
print(n * 120)shown = show_total(quantity); print("戻り値:", shown)360 戻り値: None
def calculate_total(n):
return n * 120total = calculate_total(quantity); payable = total + 50; print(total, payable)360 410
shown + 50Traceback (most recent call last): File "<console>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
演習完了