Python: вернуть возможно не возвращая значение - PullRequest
0 голосов
/ 17 ноября 2018

Сообщество Hello Stack Overflow,

Я пытаюсь написать программу, которая проверяет последнюю теорему Ферма. Проблема, с которой я сталкиваюсь, заключается в том, что появляется сообщение «NameError: имя« a »не определено. Однако я определяю« a »в своей первой функции и возвращаю ее значение в конце функции.

Я пытаюсь использовать введенные значения из первой функции во второй функции, чтобы пользователь мог определить параметры.

Не понимаю ли я, как использовать «Возвращение»? Вся помощь очень ценится и будет держать меня в здравом уме.

def input_fermat():
    a=input('Enter the first variable \'a\': \n')
    b=input('Enter the second variable \'b\': \n')
    c=input('Enter the third variable \'c\': \n')
    n=input('Enter the exponential variable \'n\': \n')

    return a, b, c, n

def check_fermat(a,b,c,n):

    calc_1=a**n
    calc_2=b**n
    calc_3=c**n

    if n>2 and int(calc_1) + int(calc_2) == calc_3:
        print('Holy smokes, Fermat was wrong!')
    else:
        print('No that doesn\'t work.')

input_fermat()
check_fermat(a,b,c,n)

Ответы [ 5 ]

0 голосов
/ 17 ноября 2018

Переменные a, b, c и n, которые вы получаете как входные данные в input_fermat(), доступны только в теле этой функции;как только вы вернетесь, вы выйдете из области действия input_fermat(), и значения в a, b, c и n будут переданы любым переменным, которые вы назвали input_fermat() для назначения.

Область действия функции означает, что единственными переменными, доступными в любой данной функции, являются

  • те, которые объявлены в теле функции
  • те, которые переданы функции в качестве аргументов в скобках.
  • переменные, объявленные глобально

В check_fermat() это означает, что вы можете повторно использовать переменные a, b, c и для чего-то другого, кроме ввода, если хотите (потому что aновая функция означает новую область видимости).

Но в приведенном ниже коде мы решили, что a, b, c и n в check_fermat() будут такими же, как a, b, c и d в input_fermat() с объявлениемa,b,c,n = input_fermat().Это решение, которое мы решили принять;это произвольно.

Вот отредактированная версия вашей функции, которая выполняет то, для чего, я думаю, вы шли:

#Global variables would be declared up here, before all other function declarations.
#Global variables would be available to all the functions that follow.

def input_fermat(): #if there were arguments in these parentheses they'd be included in input_fermat scope
    # input_fermat() scope begins
    a=int(input('Enter the first variable \'a\': \n'))
    b=int(input('Enter the second variable \'b\': \n'))
    c=int(input('Enter the third variable \'c\': \n'))
    n=int(input('Enter the exponential variable \'n\': \n'))

    return a, b, c, n
    #input_fermat() scope ends

def check_fermat(): #if there were arguments in these parentheses they'd be included in check_fermat scope
    #check_fermat() scope begins

    #just as you returned 4 variables at once in input_fermat(), 4 variables can be assigned at once here
    a,b,c,n = input_fermat() #need to assign because a, b, c, n from input_fermat() no longer in scope
    calc_1=a**n
    calc_2=b**n
    calc_3=c**n

    if n>2 and int(calc_1) + int(calc_2) == calc_3:
        print('Holy smokes, Fermat was wrong!')
    else:
        print('No that doesn\'t')

    #python implicitly does a `return None` here
    #check_fermat() scope ends

check_fermat()

Обратите внимание, что из-за областей действия этих функций я мог бы объявитьПеременные в check_fermat() выглядят следующим образом, и все будет работать (попробуйте запустить этот код для себя)

def input_fermat(): 
    a=int(input('Enter the first variable \'a\': \n'))
    b=int(input('Enter the second variable \'b\': \n'))
    c=int(input('Enter the third variable \'c\': \n'))
    n=int(input('Enter the exponential variable \'n\': \n'))

    return a, b, c, n

def check_fermat():
    any,variable,names,go = input_fermat()
    calc_1=any**go
    calc_2=variable**go
    calc_3=name**go

    if n>2 and int(calc_1) + int(calc_2) == calc_3:
        print('Holy smokes, Fermat was wrong!')
    else:
        print('No that doesn\'t')

check_fermat()

Процесс выполнения (для обоих фрагментов кода) выглядит следующим образом:

  1. check_fermat() в последней строке выполняется, потому что это единственная функция, вызываемая (не только определенная) в нашем файле .py.
  2. Python ищет определение check_fermat() для его выполнения 3.Python находит input_fermat(), вызывается внутри check_fermat и ищет input_fermat() s определение.
  3. Python находит определение, выполняет функцию и запрашивает ввод.
  4. Ввод возвращаетсяобратно к check_fermat() и используется для вычисления последней теоремы Ферма.
  5. Остальная часть check_fermat() выполняется (вывод выводится на терминал).Затем check_fermat() возвращает None, завершая вызов функции без переменных для возврата.
0 голосов
/ 17 ноября 2018

Это происходит потому, что эти переменные определены локально и недоступны в пространстве имен check_fermat.

Обратитесь к правилу LEGB .

Что вы можете сделать, это определить все эти переменные, используя ключевое слово global в определении функции, хотя обычно это не лучший подход.Вы также захотите привести все ваши входные данные к int, поскольку input () вернет строку.

0 голосов
/ 17 ноября 2018

Переменные a, b, c, n, определенные в input_fermat, существуют только внутри функции, поэтому вы их возвращаете, но когда вы вызываете функцию, вы их нигде не сохраняете. Вам следует заменить:

input_fermat()

Автор:

a, b, c, n = input_fermat()

Или вы можете напрямую передать возвращаемое значение input_fermat в check_fermat следующим образом:

check_fermat(*input_fermat())
0 голосов
/ 17 ноября 2018

Возвращенные значения не просто автоматически отображаются в вашем пространстве имен, вы должны назначить их чему-либо.

a, b, c, n = input_fermat()
0 голосов
/ 17 ноября 2018

Вы не сохраняете значения, которые возвращает функция input_fermat.Попробуйте:

a, b, c, n = input_fermat()

check_fermat(a,b,c,n)
...