Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does Python return multiple values from a function?

I have written the following code:

class FigureOut:    def setName(self, name):       fullname = name.split()       self.first_name = fullname[0]       self.last_name = fullname[1]     def getName(self):       return self.first_name, self.last_name  f = FigureOut() f.setName("Allen Solly") name = f.getName() print (name) 

I get the following Output:

('Allen', 'Solly') 

Whenever multiple values are returned from a function in python, does it always convert the multiple values to a list of multiple values and then returns it from the function?

Is the whole process same as converting the multiple values to a list explicitly and then returning the list, for example in JAVA, as one can return only one object from a function in JAVA?

like image 583
User_Targaryen Avatar asked Sep 06 '16 09:09

User_Targaryen


People also ask

Can a Python function return multiple?

Python functions can return multiple variables. These variables can be stored in variables directly. A function is not required to return a variable, it can return zero, one, two or more variables. This is a unique property of Python, other programming languages such as C++ or Java do not support this by default.

How can I return multiple values from a function?

We can return more than one values from a function by using the method called “call by address”, or “call by reference”. In the invoker function, we will use two variables to store the results, and the function will take pointer type data. So we have to pass the address of the data.

Which Python object can return multiple values from function?

Both lists and tuples let you store multiple values. This means we can use them to return multiple values to our main program. Using a list or a tuple is best if the values you are returning have some kind of relationship.


2 Answers

Since the return statement in getName specifies multiple elements:

def getName(self):    return self.first_name, self.last_name 

Python will return a container object that basically contains them.

In this case, returning a comma separated set of elements creates a tuple. Multiple values can only be returned inside containers.

Let's use a simpler function that returns multiple values:

def foo(a, b):     return a, b 

You can look at the byte code generated by using dis.dis, a disassembler for Python bytecode. For comma separated values w/o any brackets, it looks like this:

>>> import dis >>> def foo(a, b): ...     return a,b         >>> dis.dis(foo)   2           0 LOAD_FAST                0 (a)               3 LOAD_FAST                1 (b)               6 BUILD_TUPLE              2               9 RETURN_VALUE 

As you can see the values are first loaded on the internal stack with LOAD_FAST and then a BUILD_TUPLE (grabbing the previous 2 elements placed on the stack) is generated. Python knows to create a tuple due to the commas being present.

You could alternatively specify another return type, for example a list, by using []. For this case, a BUILD_LIST is going to be issued following the same semantics as it's tuple equivalent:

>>> def foo_list(a, b): ...     return [a, b] >>> dis.dis(foo_list)   2           0 LOAD_FAST                0 (a)               3 LOAD_FAST                1 (b)               6 BUILD_LIST               2               9 RETURN_VALUE 

The type of object returned really depends on the presence of brackets (for tuples () can be omitted if there's at least one comma). [] creates lists and {} sets. Dictionaries need key:val pairs.

To summarize, one actual object is returned. If that object is of a container type, it can contain multiple values giving the impression of multiple results returned. The usual method then is to unpack them directly:

>>> first_name, last_name = f.getName() >>> print (first_name, last_name) 

As an aside to all this, your Java ways are leaking into Python :-)

Don't use getters when writing classes in Python, use properties. Properties are the idiomatic way to manage attributes, for more on these, see a nice answer here.

like image 85
Dimitris Fasarakis Hilliard Avatar answered Sep 28 '22 03:09

Dimitris Fasarakis Hilliard


From Python Cookbook v.30

def myfun():     return 1, 2, 3 

a, b, c = myfun() 

Although it looks like myfun() returns multiple values, a tuple is actually being created. It looks a bit peculiar, but it’s actually the comma that forms a tuple, not the parentheses

So yes, what's going on in Python is an internal transformation from multiple comma separated values to a tuple and vice-versa.

Though there's no equivalent in java you can easily create this behaviour using array's or some Collections like Lists:

private static int[] sumAndRest(int x, int y) {     int[] toReturn = new int[2];      toReturn[0] = x + y;     toReturn[1] = x - y;      return toReturn;  } 

Executed in this way:

public static void main(String[] args) {     int[] results = sumAndRest(10, 5);      int sum  = results[0];     int rest = results[1];      System.out.println("sum = " + sum + "\nrest = " + rest);  } 

result:

sum = 15 rest = 5 
like image 40
joc Avatar answered Sep 28 '22 04:09

joc