Функция возвращает None без оператора return - PullRequest
37 голосов
/ 14 августа 2011

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

def jiskya(x, y):
    if x > y:
        print y
    else:
        print x

print(jiskya(2, 3))

дало результат:

>>>
2
None

Откуда взялся None?И что это?

Ответы [ 6 ]

45 голосов
/ 14 августа 2011

Это возвращаемое значение функции, которую вы распечатываете.Если нет оператора возврата (или просто return без аргумента ), в конец функции добавляется неявное return None.

Возможно, вы захотите вернутьзначения в функции вместо их печати:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x

print(jiskya(2, 3))
9 голосов
/ 14 августа 2011

Хорошо, чтобы начать, когда вы сделаете это:

print(jiskya(2, 3))

Вы получаете нечто в значительной степени эквивалентное этому:

print(print(2))

Итак, что происходит?print(2) выводит 2 и возвращает None, который печатается внешним вызовом.Достаточно просто.

Теперь посмотрите на это:

def hello():
    return 2

Если вы сделаете:

print(hello())

Вы получите 2, потому что если вы распечатываете функцию, вы получаете все, чтоreturn значение(Значение return обозначается return someVariable.

Теперь, хотя print не имеет круглых скобок, как и большинство функций, это функция, просто немного особенная в этом отношении.вернуть? Ничего. Поэтому, когда вы print print someVariable, вы получите None в качестве второй части, потому что возвращаемое значение print равно None.

Так как другие заявили:

def jiskya(x, y):
    if x > y:
        print(y)
    else:
        print(x)

Следует переписать:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x
2 голосов
/ 14 августа 2011

Откуда пришло «None»?

Функция.

А что это?

Это то, что вернула функция.

В Python каждая функция возвращает что-то. Это может быть «несколько вещей» с использованием кортежа или «ничто» с использованием None, но оно должно что-то возвращать. Вот как мы имеем дело с тем фактом, что нет способа указать тип возвращаемого значения (что не имеет смысла, поскольку вы не указываете типы для чего-либо еще). Когда интерпретируется как строка для печати, None заменяется строкой «Нет».

None - это особый объект, который должен представлять отсутствие каких-либо реальных вещей. Его тип NoneType (это экземпляр этого класса). Если вы ничего явно не возвращаете, вы неявно возвращаете None.

Вы написали функцию для печати одного из двух значений x или y, но не для возврата ничего. Так что None было возвращено. Затем вы попросили Python напечатать результат вызова функции. Поэтому он вызвал функцию (печатая одно из значений), а затем напечатал возвращаемое значение, которое было None, в виде текста «None».

1 голос
/ 14 августа 2011

Да, в основном вы используете операторы print в своей функции как способ возврата информации. Ты не должен этого делать. Печать НЕ совпадает с оператором возврата. Если вы просто хотите, чтобы ваша функция давала ответ без ответа none, просто введите вместо этого jiskya (2, 3). Вы увидите, что выбрасывает функция, потому что в ней есть операторы print. Если бы вместо этого вы ввели «return» в своей функции, это ничего не дало бы без «print» перед вызовом функции.

0 голосов
/ 14 августа 2011

Вы делаете две распечатки, первая в корпусе вашей функции, а вторая печатает результат функции, которой фактически нет.

Вы должны сделать что-то вроде этого:

def yourfunction(x, y):
    if x > y:
        return y
    else:
        return x

Тогда

>>> print yourfunction(2, 3)
2
0 голосов
/ 14 августа 2011

Проблема в том, что вы написали print jiskya(2,3).Вы передаете возвращаемое значение jiskya в функцию print.jiskya сам печатает x или y, поэтому вы видите 2. Но тогда print в самом операторе print jiskya(2, 3) выполняется без аргументов.

Для интерпретатора этоэто упрощение того, что происходит:

print jiskya(2,3)
>> Executing jiskya with arguments 2, 3
>> jiskya evaulates `print x`
>> 2 is printed
>> Function jiskya exits with no return value
print None
>> None is printed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...