例えば:
def tofloat(i):
return flt(i)
def addnums(numlist):
total = 0
for i in numlist:
total += tofloat(i)
return total
nums = [1 ,2 ,3]
addnums(nums)
のflt
はずfloat
ですが、構文エラーなのか実行時エラーなのか混乱しています。
実際には、これは実行時エラーです。Python はflt
実行時に (動的言語であるため) 名前を解決しようとしますが、名前が見つからないためです。これが発生すると、Python は、使用していたシンボルが見つからなかったことを示す例外を生成し、flt
これはすべて実行時に発生します。
構文エラーは、インタプリタが Python の構文に説得力のないものを見つけたときに発生します。例: Python の文法は、入力構文を有効な Python プログラムとして認識しません。これは、次の場合に発生する可能性があります。
:
の最後に追加するのを忘れましたif, def, class
あなたの例では、文法に問題はありません。インタープリターにとっては、メソッドが実際に存在するかどうかを実行時にスコープ内でチェックする必要がflt(i)
あるメソッドへの非常に有効な呼び出しです。flt
したがって、インタープリターは文句を言わず、問題の構文は適切です。
実際、これはC# や C++ などのコンパイル済み言語に比べて不利な点と見なすことができます。この種のエラーはコンパイル時にすぐに検出でき、コンパイラーはエラーを見つけると大声で叫ぶので、それに気付くことができます。
動的言語では、実際のメソッドが呼び出されるまで、これに気付かないでしょう。あなたのプログラムは単純なので、すぐにわかるかもしれません。しかし、クラスのサブクラスのサブクラス内のレガシーフレームワーク内、プロパティとして、他のモジュール内などに欠けているのはどうですか。それは厳しいでしょo
う:)float
更新: Python のドキュメント の実行モデルは、Python の内部がどのように機能するかを理解している場合に役立ちます。これにより、疑問がさらに明確になり、多くの知識が得られます:)
お役に立てれば!
SyntaxErrorは、コロンの欠落、括弧、無効なステートメントなど、構文が正しくないことが判明した場合にパーサーによって発生します。問題を修正しない限り、コードを実行することはできません。
コードは実行時、つまり関数tofloat(i)
が初めて呼び出されたときにのみエラーをスローするため、これは実行時エラーです。具体的にはNameError
。
また、バグのある部分が実行されなくなるまで、実行時エラーによってプログラムの実行が停止されることはありません。したがって、呼び出しを行わなくても、コードは実際には問題なく実行できますtofloat
。
以下のコードは 3 行目までは正常に実行されますが、NameError
発生すると停止します (実行時エラー)。
print 1
print 2
print 3
print foo
出力:
1
2
3
Traceback (most recent call last):
File "so.py", line 4, in <module>
print foo
NameError: name 'foo' is not defined
SyntaxError
最初の 3 行はまったく問題ありませんが、このコードは を作成したため実行されません。
print 1
print 2
print 2
print (foo
出力:
$ python so.py
File "so.py", line 5
^
SyntaxError: invalid syntax
in pythonもあることに注意してくださいRunTimeError
。これは、他のカテゴリのいずれにも該当しないエラーが検出されたときに発生します。
コードは次のようNameError
になります。
def tofloat(i):
return float(i)
flt
Python にはメソッドがないため、機能しません。
ちなみに、float キャストを関数にラップする必要はありません。コード全体を次のように記述できます。
def addnums(numlist):
return sum(map(float, numlist))
それを使用して:
>>> addnums(range(4))
6.0