整数の和が0の場合の2乗の和


入力した整数の合計数の和が0になったら各整数を2乗し、その和を出力したいと思っています。

例えば以下の通り入力した場合、-3の時点で合計数の和は0となるので1、2、-3のそれぞれの2乗の和を足した14を出力します。

**例1:**

[code]

    1
    2
    -3
    4
    6
    -9
    
[/code]

でも、もし例えば次のように最初に0がある場合は0を出力します。

**例2:**

[code]

    0
    1
    2
    -3
    4
    6
    -9
    
[/code]

そこで、このようなコードを書きました。

[code]

    res = []
    while True:
        num = int(input())
        if sum(res) != 0:
            res.append(num)
        else:
            break
    squares = int(res) ** 2
    print(squares)
    
[/code]

その結果、このようなエラーメッセージが表示されました。

[code]

        squares = int(res) ** 2
    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
    
[/code]

そこで8行目を次のように書き換えたところ

[code]

       squares = res ** 2
    
[/code]

このようなエラーメッセージが表示されました。

[code]

    TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
    
[/code]

どのように改善すれば良いでしょうか。よろしくお願いいたします。




やろうとされていることはだいたい理解できましたが、いくつか別々の問題があるので、順に直していきましょう。

[code]

    res = []
    while True:
        num = int(input())
        if sum(res) != 0:
            res.append(num)
        else:
            break
    
[/code]

まず上記の部分ですが、 while ループの初回実行時では `res` 変数のリスト（配列）は空っぽです。  
このため、 `sum(res)` は 必ず 0 になります。  
ゆえに、 `input()` で入力された数値にかかわらず、 `break` に到達してしまいます。

ここでは、以下のように `sum` 関数で総和を計算する **前** に、 `res` リストに入力した数値を追加するのが良いでしょう。

[code]

    res = []
    while True:
        num = int(input())
        res.append(num)
        if sum(res) == 0:
            break
    
[/code]

これで、 意図したとおり 1, 2, -3 と入力されたときにループを抜けるようになりました。

* * *

しかし、これでもまだ以下のエラーは続きます。

[code]

    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
    
[/code]

これは、 `res` 変数が、数値ではなく、リスト（配列）なので、一般的な算術計算ができないためです。

> 1、2、-3のそれぞれの2乗の和を足した

と書かれているので、ちゃんと `res` リスト内の **それぞれ** の要素について、2乗してやる必要があります。

書き方は色々ありますが、

[code]

    squares = 0
    for n in res:
        squares += n ** 2
    print(squares)
    
[/code]

とか、
[ジェネレータ式](https://docs.python.org/ja/3.7/reference/expressions.html#generator-
expressions) という仕組みを使って、以下のように1行で書くことも可能です。

[code]

    squares = sum(n ** 2 for n in res)
    print(squares)
    
[/code]

これで、期待した 14 が出力されます。




やろうとされていることはだいたい理解できましたが、いくつか別々の問題があるので、順に直していきましょう。

[code]

    res = []
    while True:
        num = int(input())
        if sum(res) != 0:
            res.append(num)
        else:
            break
    
[/code]

まず上記の部分ですが、 while ループの初回実行時では `res` 変数のリスト（配列）は空っぽです。  
このため、 `sum(res)` は 必ず 0 になります。  
ゆえに、 `input()` で入力された数値にかかわらず、 `break` に到達してしまいます。

ここでは、以下のように `sum` 関数で総和を計算する **前** に、 `res` リストに入力した数値を追加するのが良いでしょう。

[code]

    res = []
    while True:
        num = int(input())
        res.append(num)
        if sum(res) == 0:
            break
    
[/code]

これで、 意図したとおり 1, 2, -3 と入力されたときにループを抜けるようになりました。

* * *

しかし、これでもまだ以下のエラーは続きます。

[code]

    TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
    
[/code]

これは、 `res` 変数が、数値ではなく、リスト（配列）なので、一般的な算術計算ができないためです。

> 1、2、-3のそれぞれの2乗の和を足した

と書かれているので、ちゃんと `res` リスト内の **それぞれ** の要素について、2乗してやる必要があります。

書き方は色々ありますが、

[code]

    squares = 0
    for n in res:
        squares += n ** 2
    print(squares)
    
[/code]

とか、
[ジェネレータ式](https://docs.python.org/ja/3.7/reference/expressions.html#generator-
expressions) という仕組みを使って、以下のように1行で書くことも可能です。

[code]

    squares = sum(n ** 2 for n in res)
    print(squares)
    
[/code]

これで、期待した 14 が出力されます。

