2012-01-08 6 views
0

私は数値を返す関数を持っています。私はこの値を持つ変数を割り当てたいが、temp = foo(i, j)と言うと、pythonは実行時エラーを出します:NameError:name 'foo'が定義されていません。私はbarとfooの関数本体を変更したことに注意してください。明らかに1を返す関数は無駄ですが、私のエラーは変わりません。Python - 関数を使って変数を定義する方法は?

sum = 0 
for i in range(2, 100): 
    for j in range(2, i): 
     temp = foo(i, j) 
     if (temp > 100): 
      sum = sum + 1 
print sum 

def bar (n, a): 
    r = 1 
    return r 

def foo (n, a): 
    s = bar(n, a)/factorial(5); 
    return s 

def factorial (n): 
    r = 1 
    for i in range (2, n + 1): 
     r *= i; 
    return r 

答えて

3

Pythonの名前は、バインドされるまで存在しません。 def foo(...):ブロックをfoo()を使用するコードの上に移動します。

+1

Ah。それは私の愚かだった。 – user1126849

3

fooの定義は、ファイルで使用した後です。関数定義をforループの上に置きます。

2

その他の回答につきましては、コードを実行する順序が問題になります。fooは、最初に呼び出したときにまだ定義されていません。ベストプラクティスについてのコメントを追加したかっただけです。

私はいつもすべてを関数に入れて、その下のスクリプトを呼び出します。あなたは、おそらく前に、このパターンに遭遇してきた、そしてそれはに入るために良い習慣です:あなたはpython script.pyでこれを実行したり、すべてのものが定義された後のアイドルでF5キーを押すことで、run()が実行される場合

CONSTANT = 5 

def run(): 
    for i in xrange(CONSTANT): 
     print foo(i) # whatever code you want 

def foo(n): 
    # some method here... 
    pass 

if __name__ == "__main__": 
    run() 

このパターンに従うと、関数を定義する順序を心配する必要がなくなり、インポート中にスクリプトを実行することなくfooを他の関数とともにインポートできるという追加の利点が得られます。おそらく望ましい動作ではないでしょう。

関連する問題