「ある変数に、ループしながら順番に加算していきたい」というときに、その変数には何か足す前の値を代入しておかないといけません。
という1行だけのプログラムを実行しても、何と3を足せば良いのか不明ですね。
この場合、name 'a' is not defined
という「a
って何だか分からん」というエラーになります。
プログラミング言語によっては、「あらかじめ何も代入していない変数を参照すると0とか空文字列と見なしてくれる」という仕様の場合もあり、おそらくそういう言語だけでしかプログラミングしたことが無かったのでしょう。
Pythonその他多くの言語では、あらかじめ何も代入していない変数を参照するとエラーになります。
と、初期値として0を代入しておくと、「0と3を足す」ということになるので大丈夫ですね。
ところが、
unsupported operand type(s) for +=: 'builtin_function_or_method' and 'float'
このエラーメッセージは、「"組み込み関数"と"float型の値"を加算しようとしたが、それは無理」という意味です。
何故かというと、sum
という変数には、初期値として「引数の数値の合計を求める」という機能の組み込み関数が代入されているからです。
という1行だけのプログラムを実行してみると分かります。
そのため、「sum
ってなんだかわからん」というエラーにはなりませんでしたが、結局エラーです。
0で初期化しておけば良いので、
Python
1import numpy as np
2sum = 0
3for s in np.linspace(0,90,10):
4 sum += s
5print(sum)
で、一応、目的は果たせます。しかし元々sum
に代入されていた「合計を求める」という機能の組み込み関数が上書きされて今後一切使えなくなります。
「自分は使わないから良いよ」かもしれませんが、numpy
ライブラリの中で使ってそうじゃありませんか?その場合は、そのnumpy
の機能を使うと意味不明のエラーになったりしそうです。
ということで、他の方の回答のように、sum
という名前の変数は自分で勝手に使わない方が良いです。
もちろん、使わない方が良いというか「使ってはいけない名前」はsum
だけじゃなくて、組み込み関数名や組み込みクラスの名前全部です。間違えてfrom
とかの予約語を変数名に使おうとするとエラーになるのでわかりますが、sum
などは予約語じゃないのでエラーになりません。
つまりPythonでプログラムを書く時は、組み込み関数名や組み込みクラス名を全部記憶した上で、それらを自分の変数名や関数名として使ってはいけないという、ちょっとつらい仕様の言語です。
これを楽にするためには、そのあたりを指摘してくれるような開発ツールを使うのが良いでしょう。