возвращение значений функции в python - PullRequest
0 голосов
/ 19 мая 2018

Почему я должен возвращать функцию в другом случае?Разве я не могу просто применить определенную функцию, потому что мне нужно только вернуть значение b и сохранить его?

def gcd_a(a,b):

    if a==0:
        return b
    else:
        gcd_a(b%a,a)

Ответы [ 4 ]

0 голосов
/ 19 мая 2018

Если ваша функция завершает работу, ничего не возвращая, она неявно возвращает None.

def double(val):
   val * 2

value = double(10)
print(value)

Это нормально, за исключением того, что у него нет оператора return, и все, что вы получите, это None

То же самое относится к рекурсивным функциям: вы можете делать всерекурсивные вызовы функций, которые вы хотите, но если вы на самом деле не возвращаете результат функции, то она вернет None.

0 голосов
/ 19 мая 2018

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

Прямо сейчас, когда вы вызываете gcd_a, рекурсивный вызов gcd_a будет , в конечном итоге вернет значение, однако оно будет потеряно, так как функция, к которой вы обращаетесьresult не возвращает значение.

Чтобы показать вам, что это правда, давайте добавим оператор log, который выводит при возврате функции:

def gcd_a(a,b):
    if a==0:
      print('finally returning!', b)
      return b
    else:
        gcd_a(b%a,a)

Теперь, если мы вызовем:

print(gcd_a(10, 99))

Мы получаем следующий вывод:

finally returning! 1
None

Где-то рекурсивный вызов gcd_a обнаружил, что ваше условие равно True, и возвратил 1, однако эторезультат не печатается, потому что он не возвращается вашим вызовом gcd_a


* Если вы не делаете что-то странное, например, обновление глобальной переменной и т. д. ...

0 голосов
/ 19 мая 2018

ИМХО, проблема в том, как вы думаете о функции , которую необходимо очистить.Тот факт, что вы испытываете это сомнение в рекурсивном вызове функции , является случайным, потому что вы вызываете одну и ту же функцию снова и снова с разными аргументами, вызывающими выполнение разных ветвей.

Как будетфункция, которая return ничего в любых ее ветвях не будет полезна для caller?В вашем случае, что произойдет, если ваша функция caller вызовет ее с аргументом, который попадает в ваш блок else?Он ничего не вернет, и это не поможет caller!

Теперь в вашем рекурсивном случае, если ваш caller вызывает функцию с аргументом, который попадает в блок if, он будет работатькак и ожидалось.Однако, если он попадет в блок else, он станет вызывающим и снова вызовет ту же функцию.Для простоты предположим, что на этот раз он достигает условия if и возвращает что-то своему вызывающему.Однако достигнет ли это оригинал caller, который инициировал все?Ответ отрицательный, потому что вы не возвращаете его ему!

В большинстве случаев вам потребуется return для каждой ветви функции, если вы не делаете это специально для побочного эффекта.

0 голосов
/ 19 мая 2018

В блоке else, если вы не возвращаете вызов функции, внешняя функция возвращает None, потому что интерпретатор python просто выполняет все, что возвращается функцией gcd.

Давайте предположим следующий код:

def func():
    10

В этой функции она просто запускает 10, но это не значит, что функция имеет какой-то возврат.

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