reckoner
reckoner

Reputation: 2981

return variable outputs in Python function?

I have a function that returns a list. When I know the number of elements in the list I can do something like:

x,y,z=foo()

however, the number of elements in the list can vary. I would like to do something like

x,y*=foo()

where x would contain the first element in the returned list and y* would contain the remainder of however many elements there are left. Obviously , this syntax is not supported in Python. Is there a philosophical reason for this? Am I thinking about this the wrong way?

thanks in advance.

Upvotes: 1

Views: 4318

Answers (4)

user2940756
user2940756

Reputation: 55

What you need to do is to return a list

e.g. return [ ... ]

You then receive the list and find its length e.g. abc=f(.....)

len(abc) would give you the number of elements in the list

for iiabc in abc: would allow you to access each of the elements

Upvotes: 0

Peter Hansen
Peter Hansen

Reputation: 22047

A slightly generalized approach:

>>> def unpack(seq, count):
...   return seq[:count] + [seq[count:]]
>>> a, b = unpack([1, 2, 3], 1)
>>> a
1
>>> b
[2, 3]
>>> a, b = unpack([1, 2], 1)
>>> a
1
>>> b
[2]
>>> a, b = unpack([1], 1)
>>> a
1
>>> b
[]
>>> a, b = unpack([], 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 1 value to unpack
>>> a, b, c, d = unpack(range(10), 3)
>>> a
0
>>> b
1
>>> c
2
>>> d
[3, 4, 5, 6, 7, 8, 9]

Upvotes: 3

Ned Batchelder
Ned Batchelder

Reputation: 375484

There is no philosophical objection to your syntax, in fact, it's supported in Python 3.1:

>>> a, *b = range(10)
>>> a
0
>>> b
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> # Or even more flexibly:
>>> a, *b, c = range(10)
>>> a
0
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
>>> c
9
>>>

Upvotes: 16

S.Lott
S.Lott

Reputation: 391818

Like this

results = foo()
x= results[0]
y= results[1:]

Or change your function to return a two-tuple

def foo():
    ....
    return someList[0], someList[1:]

Upvotes: 3

Related Questions