Python Functions, Packing, and Unpacking Packing and Unpacking Unpacking

unpacking question.

can anyone tell me why this code doesn't run interms of unpacking?

def league(*teams):
    team1, team2, team3 = teams
    print(team1)

prem = ["arsenal", "chelsea", "liverpool"]
league(prem)

'ValueError: not enough values to unpack (expected 3, got 1)' is what is return but considering there is 3 strings in the list i don't understand what the problem is?

2 Answers

AJ Tran
seal-mask
STAFF
.a{fill-rule:evenodd;}techdegree
AJ Tran
Treehouse Teacher

Hi aaron roberts !

prem = ["arsenal", "chelsea", "liverpool"]
league(prem)

# => ValueError: not enough values to unpack (expected 3, got 1)

prem counts as one value, since it is one list!

The notation you'll want is:

league('arsenal', 'chelsea', 'liverpool')

# => arsenal

Try this out and see :)

Thanks!

Alexis Othonos
Alexis Othonos
3,108 Points

Or you can unpack the list before passing it as an argument:

prem = ["arsenal", "chelsea", "liverpool"]
league(*prem)

thanks! i think i just covered this in one of the courses, so the * in the argument counts towards there being more values?

Alexis Othonos
Alexis Othonos
3,108 Points

The asterisk (*) works only on iterables.

So if you know that what you are passing is a list, tuple, etc. then you can safely add the asterisk to unpack the values.

Try with print function

prem = ["arsenal", "chelsea", "liverpool"]
teams = 3

# pass list as a single element, therefore the list as an element will be printed:
print(prem)
# ['arsenal', 'chelsea', 'liverpool']

# pass list arguments individually by unpacking. The print function can automatically handle multiple arguments
print(*prem)
# arsenal chelsea liverpool

# unpack non iterable value in function:
print(*teams)
# TypeError

Hope this helps