質問: map(int,input().split()) print(a+b+c) ``` 出力 下記のように出したいです。 ``` 5 8 7 20 ``` 他にいい方法があれば教えてください。よろしくお願いします。
回答: 「必ず 3 個の入力が与えられるので、その 3 個を受け取りたい」という風に固定長の入力を受け取りたいのであれば、例 2 のプログラムで動くはずです。 ``` a, b, c = map(int, input().split()) print(a + b + c) ``` そうではなくて「何個か分からないけど入力が与えられるので、それらを受け取りたい」という風に可変長の入力を受け取りたいのであれば、例 1 と似た感じでリストとして受け取るのが便利です。 ``` abc = list(map(int, input().split())) print(abc[0] + abc[1] + abc[2]) # (必ず 3 個は入力があると分かっている場合) ``` このように受け取ると、`abc[0]` に 1 つ目の入力、`abc[1]` に 2 つ目の入力、`abc[2]` に 3 つ目の入力、......といった感じで格納されます。入力が何個あったかは `len(abc)` で調べられます。 動作の説明 ところでそもそも、上のプログラムたちはどのようにして入力を受け取っているのでしょうか。この点を理解しておくとエラーの原因を把握しやすくなるので、説明してみます。 1. まず、`input()` は 1 行の入力を **文字列として** 受け取る関数です。 2. 受け取った文字列を `split()` することで、空白文字で分割し、**文字列のリストとして** 受け取ります。 3. `int()` は文字列を整数値に変換する関数です。`map()` を使うことで、リストの各要素に対してひとつずつ `int()` を適用することができます。この際、`map()` した後の値はリストではなく「イテレーター」というものになります。したがって `map(int, ...)` の部分によって **整数値のイテレーターとして** 受け取ることができます。 4. * 固定長の場合、`a, b, c = map( ... )` のように書くことによって、イテレーターの先頭から 3 個 整数値をもらってきてそれぞれ `a`、`b`、`c` に代入します。それぞれの変数には各々ひとつの **整数値** が格納されます。 * 可変長の場合、イテレーターではなくてリストとしてもらっておくと `abc[0]` のように添え字付けができるので便利です。`list()` を使うとイテレーターをリストに変換できるので `abc = list(map( ... ))` のように書くと `abc` には **整数値のリスト** が格納されます。 具体例で見てみましょう。入力が `5 8 7` だったとすると、それぞれの関数によって以下のように処理されていきます。 ``` ↓ input() "5 8 7" (文字列) ↓ split() ["5", "8", "7"] (文字列のリスト) ↓ map(int, ...) [5, 8, 7] を返すようなイテレーター ↓ list() [5, 8, 7] (整数値のリスト) ```