2012-01-08 3 views
0

J'ai une fonction qui retourne un nombre. Je veux assigner une variable pour avoir cette valeur, mais python donne une erreur d'exécution quand je dis temp = foo(i, j): NameError: le nom 'foo' n'est pas défini. Notez que j'ai changé les corps de fonctions de bar et foo, évidemment avoir une fonction qui retourne juste 1 est inutile, mais cela ne change pas mon erreur.Python - comment définir une variable en utilisant une fonction?

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 

Répondre

3

Les noms en Python n'existent pas tant qu'ils ne sont pas liés. Déplacez le bloc def foo(...): au-dessus du code qui utilise foo().

+1

Ah. C'était idiot de ma part. – user1126849

3

Votre définition de foo est APRÈS que vous l'utilisiez dans le fichier. Mettez votre définition de fonction au-dessus de la boucle for.

2

Comme d'autres réponses, votre problème est l'ordre dans lequel vous exécutez votre code: foo n'a pas encore été défini lorsque vous l'appelez pour la première fois. Je voulais juste ajouter un commentaire sur les meilleures pratiques ici.

J'essaie toujours de tout mettre dans une fonction, puis d'appeler n'importe quel script en bas. Vous avez probablement rencontré ce modèle avant, et il est une bonne habitude à prendre:

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

si vous exécutez cela avec python script.py ou en appuyant sur f5 au ralenti, run() sera exécuté après tout est défini. En suivant ce modèle, vous n'avez pas à vous soucier de l'ordre dans lequel vous définissez vos fonctions, et vous avez l'avantage de pouvoir importer foo avec d'autres fonctions sans avoir à exécuter votre script lors de l'importation, ce qui est probablement pas un comportement désiré.

Questions connexes