7

例えば:

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ですが、構文エラーなのか実行時エラーなのか混乱しています。

4

3 に答える 3

7

実際には、これは実行時エラーです。Python はflt実行時に (動的言語であるため) 名前を解決しようとしますが、名前が見つからないためです。これが発生すると、Python は、使用していたシンボルが見つからなかったことを示す例外を生成し、fltこれはすべて実行時に発生します。

構文エラーは、インタプリタが Python の構文に説得力のないものを見つけたときに発生します。例: Python の文法は、入力構文を有効な Python プログラムとして認識しません。これは、次の場合に発生する可能性があります。

  1. , etc 式:の最後に追加するのを忘れましたif, def, class
  2. 括弧や括弧などを閉じるのを忘れました。
  3. Pythonの文法に準拠していない他の多くの場所:)

あなたの例では、文法に問題はありません。インタープリターにとっては、メソッドが実際に存在するかどうかを実行時にスコープ内でチェックする必要がflt(i)あるメソッドへの非常に有効な呼び出しです。fltしたがって、インタープリターは文句を言わず、問題の構文は適切です。

実際、これはC# や C++ などのコンパイル済み言語に比べて不利な点と見なすことができます。この種のエラーはコンパイル時にすぐに検出でき、コンパイラーはエラーを見つけると大声で叫ぶので、それに気付くことができます。

動的言語では、実際のメソッドが呼び出されるまで、これに気付かないでしょう。あなたのプログラムは単純なので、すぐにわかるかもしれません。しかし、クラスのサブクラスのサブクラス内のレガシーフレームワーク内、プロパティとして、他のモジュール内などに欠けているのはどうですか。それは厳しいでしょoう:)float

更新: Python のドキュメント の実行モデルは、Python の内部がどのように機能するかを理解している場合に役立ちます。これにより、疑問がさらに明確になり、多くの知識が得られます:)

お役に立てれば!

于 2013-06-23T15:46:37.853 に答える
2

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。これは、他のカテゴリのいずれにも該当しないエラーが検出されたときに発生します。

于 2013-06-23T15:48:27.677 に答える
0

コードは次のようNameErrorになります。

def tofloat(i): 
    return float(i)

fltPython にはメソッドがないため、機能しません。

ちなみに、float キャストを関数にラップする必要はありません。コード全体を次のように記述できます。

def addnums(numlist):
    return sum(map(float, numlist))

それを使用して:

>>> addnums(range(4))
6.0
于 2013-06-23T15:43:51.313 に答える