77961
1行ごとに整数が入力され、最後の行がピリオド.で終了するとします。そして、入力された数の平均を計算して出力したいと思っています。イメージとしては、このように入力されたとします

```

    5 
    2 
    10 
    1
    .
    
```

それをこのように出力したいのです

```

    4.5
    
```

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

```

    num = input()
    res = []
    while num != ".":
        res.appen(num)
        if num = ".":
            break
        print(mean(res))
    
```

その結果このようなエラーメッセージを受け取りました。

```

    Error:
      File "jailed_code", line 5
        if num = ".":
               ^
    SyntaxError: invalid syntax
    
```

この場合、5行目が問題なのは明らかなのですが、それ以外にも問題があるかもしれません。どのようにすれば改善すれば良いでしょうか。よろしくお願いいたします。
CC BY-SA 4.0
2021-07-04T07:32:08.433
77958
2021-07-04T09:15:06.170
2021-07-04T08:07:43.530
26370
47136
question
python python3
pythonでwhileループなどを使って平均計算の出力をする方法は？
質問の直接の答えは`比較演算子が違う`からです。以下2つの記事を良く見てください。  
問題の箇所は`==`が正しく、つまり`=`が一つ足らないことが原因です。

[4.1. if 文](https://docs.python.org/ja/3/tutorial/controlflow.html#if-
statements)  
[6.10.
比較](https://docs.python.org/ja/3/reference/expressions.html#comparisons)

* * *

他にはこれらの課題があります。

  * 数値を入力できるのが先頭行の1回だけで、複数の数値を繰り返し入力出来るようになっていません。ループの中(の先頭)に移動する必要があるでしょう。
  * `while`の条件部と、途中の`if`文の両方でループ終了を判定するのは冗長で間違いやすいので判定は1ヵ所に絞りましょう。
  * `appen()`というメソッドはありません。`append()`のtypoですね。
  * 最後の`.`を入力したら、結果を出力せずにプログラムを終了する形になっています。
  * `mean()`メソッドは`statistics`を`import`しないと使えるようにはなりません。
  * `mean()`メソッドは数値の平均を計算するものなので、`res`リストには文字列ではなくintの数値が入っていなければなりません。  
`res`に`append`する際に`int`に変換しておくか、`mean`を計算する際または直前に`int`に変換する必要があります。

  * 数値を繰り返し入力出来るようになったとしても今の`print(mean(res))`の位置では数値を入力する毎に平均値を表示することになります。平均値表示の処理はどこで行うのが良いか考え直してください。

[5.1.
リスト型についてもう少し](https://docs.python.org/ja/3/tutorial/datastructures.html#more-
on-lists)

> list.append(x)  
>  リストの末尾に要素を一つ追加します。a[len(a):] = [x] と等価です。

[statistics ---
数理統計関数](https://docs.python.org/ja/3.9/library/statistics.html)  
[Pythonで平均、中央値、最頻値、分散、標準偏差を算出](https://note.nkmk.me/python-statistics-mean-
median-mode-var-stdev/)

[数値型 int, float,
complex](https://docs.python.org/ja/3/library/stdtypes.html#numeric-types-int-
float-complex)

> 演算 結果  
>  int(x) x の整数への変換

* * *

`mean`を使わずに済ませるなら、直接の答えは提示していませんが、こんな記事もあります。  
[無限ループからの平均値を出したい](https://ja.stackoverflow.com/q/70598/26370)
CC BY-SA 4.0
2021-07-04T08:45:52.067
77961
2021-07-04T08:52:59.947
2021-07-04T08:52:59.947
26370
26370
77958
answer
> それ以外にも問題があるかもしれません。どのようにすれば改善すれば良いでしょうか。

`input()` を使用する場合、`EOF(End of File)` を検出すると `EOFError` が発生します。以下の様に
`iteration` を利用すれば `EOF` で for loop が自動的に停止します。

[7.2.1. Methods of File
Objects](https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-
objects)

> For reading lines from a file, you can loop over the file object. This is
> memory efficient, fast, and leads to simple code:
```

>     >>> for line in f:
>     ...     print(line, end='')
>     ...
>  
```

また、入力文字列を数値への変換する場合にエラーになる場合(非数値な文字列を入力する)を考慮して例外処理を追加します。その他に、入力値が全くない(最初に
`.` を入力してしまう)場合に `ZeroDivisionError` が発生してしまいますので、`res` リストの要素数をチェックします。

※ 以下、walrus operator(`:=`, セイウチ演算子)を使っていますので Python 3.8 以降でのみ動作します

**mean.py**

```

    import sys
    
    res = []
    for num in sys.stdin:
      num = num.strip()
      if num == '.': break
      try:
        n = float(num)
      except ValueError as e:
        print(e, file=sys.stderr)
        sys.exit(1)
      res.append(n)
    
    if (l := len(res)) > 0:
      mean = sum(res)/l
      print(f'{mean = }')
    else:
      print('there is no numbers', file=sys.stderr)
    
```

Python3 における `float`型には表現可能な数値に最小値・最大値が存在します(`int`型にはなし)。

```

    $ python3 --version
    Python 3.9.5
    
    $ python3 -c 'import sys;print(sys.float_info)'
    sys.float_info(max=1.7976931348623157e+308, max_exp=1024,
    max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021,
    min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
    
```

したがって、計算結果にオーバーフローが発生する可能性があるのですが、実際には `inf`(infinity) が返ります。

```

    $ python3 mean.py
    1e+500
    1e+1000
    .
    mean = inf
    
```
CC BY-SA 4.0
2021-07-04T09:15:06.170
77962
2021-07-04T09:15:06.170
47127
77958
answer