It is unclear to me why the variables have to be in the position they are versus how I assigned them in a single line of code? Not clear on the explanation…

How you return output from the function defined in def func should guide how you receive the outputs from calling the function.
So what is the physical meaning of the variables returned in the if header path? (this is the point of maximum confusion)

Just curious, what happens when you call this function with header=False to let it go down the else path? Do you get ValueError: too many values to unpack (expected 2)