Рассмотрим три функции:
def my_func1():
print "Hello World"
return None
def my_func2():
print "Hello World"
return
def my_func3():
print "Hello World"
Все они, кажется, возвращают None. Есть ли различия между поведением возвращаемых значений этих функций? Есть ли причины отдавать предпочтение одному другому?
return None
для меня это означает, что функция иногда имеетNone
невозвратное значение, но в местеreturn None
, где нет такого возвращаемого значения. Запись noreturn
вообще подразумевает, что здесь никогда не бывает интересного возвращаемого значения, вроде «процедуры», а не «функции».return
подразумевает существование на ранней стадии «процедуры» в соответствии с предыдущим пунктом.Ответы:
По фактическому поведению разницы нет. Все они возвращаются
None
и все. Тем не менее, есть время и место для всего этого. Следующие инструкции в основном показывают, как следует использовать различные методы (или, по крайней мере, как меня учили, что их следует использовать), но они не являются абсолютными правилами, поэтому вы можете смешивать их, если считаете нужным.С помощью
return None
Это говорит о том, что функция действительно предназначена для возврата значения для последующего использования, и в этом случае она возвращает
None
. Это значениеNone
затем может быть использовано в другом месте.return None
никогда не используется, если нет других возможных возвращаемых значений из функции.В следующем примере мы возвращаем
person
,mother
еслиperson
данное является человеком. Если это не человек, мы возвращаемся,None
поскольку уperson
него нетmother
(предположим, это не животное или что-то в этом роде).С помощью
return
Это используется по той же причине, что и
break
в циклах. Возвращаемое значение не имеет значения, и вы хотите выйти только из всей функции. Это очень полезно в некоторых местах, хотя вам это не нужно часто.У нас 15
prisoners
и мы знаем, что у одного из них есть нож. Мы перебираем каждогоprisoner
по одному, чтобы проверить, есть ли у них нож. Если мы ударим человека ножом, мы можем просто выйти из функции, потому что мы знаем, что есть только один нож, и нет причины проверять остальную частьprisoners
. Если мы не найдемprisoner
ножа, мы выдадим предупреждение. Это может быть сделано разными способами, и использованиеreturn
, вероятно, даже не лучший способ, но это просто пример, показывающий, как использоватьreturn
для выхода из функции.Примечание. Никогда не следует этого делать
var = find_prisoner_with_knife()
, поскольку возвращаемое значение не предназначено для перехвата.Использование нет
return
вообщеЭто также вернет
None
, но это значение не предназначено для использования или перехвата. Это просто означает, что функция завершилась успешно. В основном это то же самое, что иreturn
вvoid
функциях таких языков, как C ++ или Java.В следующем примере мы устанавливаем имя матери человека, а затем функция завершается после успешного завершения.
Примечание. Никогда не следует этого делать
var = set_mother(my_person, my_mother)
, поскольку возвращаемое значение не предназначено для перехвата.источник
var = get_mother()
Это нормально, если вы переходитеvar
к другим функциям, которые принимаютNone
- «никогда» - это немного экстримvar = get_mother()
не может быть использовано? ИМХО, это совершенно нормально. Вам просто нужно убедиться, что у вас нетNone
значения,if var
прежде чем использовать его.Да, они все одинаковые.
Мы можем просмотреть интерпретированный машинный код, чтобы убедиться, что они все делают одно и то же.
источник
dis.dis
возвращаетсяNone
: -Xdis.dis
также сообщает некоторые номера строк ...Каждый из них возвращает один и тот же синглтон
None
- функциональной разницы нет.Я думаю, что это разумно идиоматично - исключать
return
утверждение, если вам не нужно, чтобы оно вышло из функции раньше (в этом случае голоеreturn
более распространено) или возвратило что-то иное, чемNone
. Это также имеет смысл и кажется идиоматичным для написания,return None
когда оно находится в функции, у которой есть другой путь, который возвращает что-то отличное отNone
.return None
Явное написание является визуальным сигналом для читателя, что есть другая ветвь, которая возвращает что-то более интересное (и что вызывающий код, вероятно, должен будет обрабатывать оба типа возвращаемых значений).Часто в Python функции, которые возвращают
None
, используются какvoid
функции в C - их цель обычно состоит в том, чтобы работать с входными аргументами на месте (если вы не используете глобальные данные ( дрожание )). ВозвращениеNone
обычно делает более явным, что аргументы были видоизменены. Это делает немного более понятным, почему имеет смысл исключать этоreturn
утверждение с точки зрения «языковых соглашений».Тем не менее, если вы работаете в кодовой базе, в которой уже есть заранее заданные соглашения в отношении этих вещей, я определенно последую их примеру, чтобы помочь кодовой базе оставаться единообразной ...
источник
return
оператор, она возвращаетсяNone
.Ruby
иJavascript
используют тот же подход, что и Python. Я уверен , что есть примеры языков высокого уровня , которые говорят , «пустота» в выражении , но я не могу вспомнить ни в данный момент (может быть , если вы считаете ,Java
язык высокого уровня) ... Как обезьяньего заплат функция (которая полезна для проверки в тестах, между прочим) работает в гипотетическом мире, где python получилvoid
ключевое слово, которое сделало так, чтобы функция ничего не возвращала? (Кроме того, как я уже говорил, вам не нужно убеждать меня, что это плохой дизайн. Я ничего не могу сделать, даже если вы правы)Как и другие ответили, результат точно такой же,
None
возвращается во всех случаях.Различие стилистическое, но учтите, что PEP8 требует, чтобы использование было последовательным:
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
По сути, если вы когда-либо возвращаете не-
None
значение в функцию, это означает, что возвращаемое значение имеет смысл и предназначено для перехвата вызывающими. Поэтому при возвратеNone
оно также должно быть явным, чтобы передатьNone
в этом случае значение, это одно из возможных возвращаемых значений.Если вам вообще не нужен возврат, вы в основном работаете как функция, а не как функция, так что просто не включайте
return
оператор.Если вы пишете функцию, подобную процедуре, и есть возможность вернуться раньше (т. Е. Вы уже закончили на этом этапе и вам не нужно выполнять оставшуюся часть функции), вы можете использовать пустое значение
return
s для подачи сигнала читателю. это просто раннее завершение выполнения, иNone
значение, возвращаемое неявно, не имеет никакого значения и не предназначено для перехвата (функция, подобная процедуре, всегда возвращает вNone
любом случае).источник
С точки зрения функциональности все они одинаковы, разница между ними заключается в удобочитаемости и стиле кода (что важно учитывать)
источник