Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

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
STAFF
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!

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

prem = ["arsenal", "chelsea", "liverpool"]
league(*prem)
AJ Tran
AJ Tran
Treehouse Teacher

Alexis Othonos, you're a real MVP! aaron roberts, make sure you see this other answer!!

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

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