2012-01-08 31 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

啊。這真是愚蠢。 – user1126849 2012-01-08 06:23:43

3

您對foo的定義是在您在文件中使用它之後。將你的函數定義放在for循環之上。

2

根據其他答案,您的問題是您運行代碼的順序:foo尚未在第一次調用時定義。只是想在這裏添加有關最佳實踐的評論。

我總是嘗試將所有內容放入函數中,然後調用底部的任何腳本。你可能遇到過這種模式,這是一個很好的習慣進入:

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() 

,如果你運行與python script.py,或按閒置F5,一切都被定義後run()將被執行。

通過遵循這種模式,您不必擔心定義函數的順序,而且您還可以在不導入foo的情況下使用其他函數導入foo,而無需在導入期間執行腳本可能不是一個理想的行爲。