first_middle_last(sequence) using extended unpacking (first, *middle, last = sequence) to return a tuple (first, middle, last), where middle is a list of everything between the first and last elements. Handle a sequence of exactly length 2 (middle is an empty list), and raise ValueError for sequences shorter than 2 elements with an explicit guard clause rather than letting the raw unpacking fail with an unclear error.first_middle_last([1, 2, 3, 4, 5])
(1, [2, 3, 4], 5)
first=1, last=5, everything else collected into middle.
first_middle_last([1, 2])
(1, [], 2)
No elements are left over for middle.
first_middle_last([1])
ValueError raised
Guard clause rejects sequences shorter than 2 elements.
Check len(sequence) < 2 first and raise ValueError.
first, *middle, last = sequence collects the interior into a list automatically.