Python - как определить переменную с помощью функции? - PullRequest
0 голосов
/ 08 января 2012

У меня есть функция, которая возвращает число.Я хочу присвоить переменной значение, но python выдает ошибку времени выполнения, когда я говорю temp = foo(i, j): NameError: name 'foo' не определено.Обратите внимание, что я изменил тела функций bar и foo, очевидно, что иметь функцию, которая просто возвращает 1, бесполезно, но это не меняет мою ошибку.

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 ]

3 голосов
/ 08 января 2012

Имена в Python не существуют, пока они не связаны.Переместите блок def foo(...): над кодом, который использует foo().

3 голосов
/ 08 января 2012

Ваше определение foo - ПОСЛЕ того, как вы используете его в файле.Поместите определение вашей функции выше цикла for.

2 голосов
/ 08 января 2012

Как и в других ответах, ваша проблема - это порядок, в котором вы запускаете свой код: 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 с другими функциями без выполнения скрипта во время импорта, что вероятно, не желаемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...