Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

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!

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?

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