57

I tried writing this code:

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

print(smaller(2, 3))

I got this result:

>>>
2
None

Where did the None come from? What does it mean?


See also

The accepted answer explains the importance of returning a value from the function, rather than printing it. For more information, see What is the purpose of the return statement? How is it different from printing?.

To understand the None result itself, see What is a 'NoneType' object?.

If you are printing inside the function in order to see multiple values, it may be better to instead collect those values so that they can be printed by the calling code. For details, see How can I use `return` to get back multiple values from a loop? Can I put them in a list?.

wjandrea
  • 28,235
  • 9
  • 60
  • 81
Grant
  • 891
  • 1
  • 9
  • 15
  • Related: [How is returning the output of a function different from printing it?](https://stackoverflow.com/q/750136/7851470) – Georgy Dec 07 '20 at 20:50
  • you forgot to return a value in your function so the intrepretor returned none – Golden Lion Sep 07 '21 at 17:41
  • @Georgy I've edited the canonical for that link into the question. I've been doing a fair bit of work cleaning up canonicals for Python questions lately. – Karl Knechtel Aug 12 '22 at 06:42

7 Answers7

65

It's the return value of the function, which you print out. If there is no return statement (or just a return without an argument), an implicit return None is added to the end of a function.

You probably want to return the values in the function instead of printing them:

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

print(jiskya(2, 3))
phihag
  • 278,196
  • 72
  • 453
  • 469
  • 1
    Is there a place where it is specified, that "an implicit `return None` is added"? – Micha Wiedenmann Jun 01 '18 at 07:41
  • 4
    @MichaWiedenmann I could not find any statement to that effect in [the Python reference](https://docs.python.org/dev/reference/index.html), but [here is the comment (and code) adding the `return None` in cpython](https://github.com/python/cpython/blob/23cee80cfade1a9019c52b3a17d8e5c1b5db17e2/Python/compile.c#L5501-L5510). – phihag Jun 01 '18 at 09:24
  • if I wanted to be explicit, could I end the function with `return None` ? – PatrickT May 07 '20 at 10:39
  • 1
    @PatrickT In the example of the question that makes no sense, but yes, if you want your function to return `None` then `return None` is great, and probably clearer than just a bare `return`. – phihag May 07 '20 at 11:39
  • @phihag: I didn't find one in the reference, but [the official tutorial on defining functions](https://docs.python.org/dev/tutorial/controlflow.html#defining-functions) says: "The `return` statement returns with a value from a function. `return` without an expression argument returns `None`. Falling off the end of a function also returns `None`." – ShadowRanger Jul 09 '22 at 13:23
18

Ok, to start off when you do this:

print(jiskya(2, 3))

You getting something pretty much equivalent to this:

print(print(2))

So, what is going on? The print(2) is printing out 2, and returns None which is printed by the outer call. Straightforward enough.

Now look at this:

def hello():
    return 2

If you do:

print(hello())

You get 2 because if you print out a function you get whatever the return value is. (The return value is denoted by the return someVariable.

Now even though print doesn't have parenthesis like most functions, it is a function just a little special in that respect. What does print return? Nothing. So when you print print someVariable, you will get None as the second part because the return value of print is None.

So as others have stated:

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

Should be re-written:

def jiskya(x, y):
    if x > y:
        return y
    else:
        return x
Dair
  • 15,910
  • 9
  • 62
  • 107
  • What if the print argument is in a while loop? If I replace "print" with "return", then I can only get one value printed instead of the full iteration. – yihan Feb 26 '18 at 14:42
5

Where did the 'None' come from?

The function.

And what is it?

It's what the function returned.

In Python, every function returns something. It could "be multiple things" using a tuple, or it could "be nothing" using None, but it must return something. This is how we deal with the fact that there is no way to specify a return type (which would make no sense since you don't specify types for anything else). When interpreted as a string for printing, None is replaced with the string "None".

None is a special object that is supposed to represent the absence of any real thing. Its type is NoneType (it is an instance of that class). Whenever you don't explicitly return anything, you implicitly return None.

You wrote the function to print one of the two values x or y, but not to return anything. So None was returned. Then you asked Python to print the result of calling the function. So it called the function (printing one of the values), then printed the return value, which was None, as the text "None".

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
1

You are doing two prints, the first one in the corpus of your function and the second one is printing the result of the function, which as actually None.

You should rather do something like this:

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

Then,

>>> print yourfunction(2, 3)
2
Alexis Métaireau
  • 10,767
  • 5
  • 24
  • 34
1

Ya, basically you are using print statements in your function as a way to return information. You shouldn't do this. Print is NOT the same as a return statement. If you simply want your function to give your answer without the none, just type jiskya(2, 3) instead. You will see what the function throws out because you have print statements in the function. If instead you typed "return" in your function, it wouldn't give you anything without the "print" preceding the function call.

de1337ed
  • 3,113
  • 12
  • 37
  • 55
0

Consider following examples:

Function without return statement

Print() function type is none type..

def test1():

    print("code...!!!")

type(test1())

Output: code...!!!
        NoneType

Function with return statement

Returning variable 'a' which holds print() function, that's why type() returns data type of print function which is NoneType, not the data type of what's inside the print funcion:

def test1():

    a= print("code...!!!")
    
    return a

type(test1())


Output: code...!!!
        NoneType

Here function returning data type of variable 'a' which holds a string in it.

def test1():

    a = "First code...!!!"
    
    return a

type(test1())


Output: str

Avinash
  • 48
  • 1
  • 8
0

The problem is you wrote print jiskya(2,3). You're passing the return value of jiskya to the print function. jiskya itself prints x or y, which is why you see the 2. But then the print in the print jiskya(2, 3) statement itself executes with no argument.

To the interpreter, this is a simplification of what happens:

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
Jared Ng
  • 4,891
  • 2
  • 19
  • 18