Passing functions which have multiple return values as arguments in Python

James picture James · Mar 27, 2009 · Viewed 9.6k times · Source

So, Python functions can return multiple values. It struck me that it would be convenient (though a bit less readable) if the following were possible.

a = [[1,2],[3,4]]

def cord():
    return 1, 1

def printa(y,x):
    print a[y][x]

printa(cord())

...but it's not. I'm aware that you can do the same thing by dumping both return values into temporary variables, but it doesn't seem as elegant. I could also rewrite the last line as "printa(cord()[0], cord()[1])", but that would execute cord() twice.

Is there an elegant, efficient way to do this? Or should I just see that quote about premature optimization and forget about this?

Answer

David Z picture David Z · Mar 27, 2009
printa(*cord())

The * here is an argument expansion operator... well I forget what it's technically called, but in this context it takes a list or tuple and expands it out so the function sees each list/tuple element as a separate argument.

It's basically the reverse of the * you might use to capture all non-keyword arguments in a function definition:

def fn(*args):
    # args is now a tuple of the non-keyworded arguments
    print args

fn(1, 2, 3, 4, 5)

prints (1, 2, 3, 4, 5)

fn(*[1, 2, 3, 4, 5])

does the same.