How make f[{x,y}] evaluate as f[x,y]?
You can alter your original definition to accept both:
Clear[f]
f[{x_, y_} | PatternSequence[x_, y_]] := 9 - x^2 - y^2
{f[3, 4], f[{3, 4}]}
(* {-16, -16} *)
Why not define a pure function and then Apply that to the list?
f[#1, #2] & @@ p
Apply is straightforward to explain to beginners because it simply replaces the head of an expression.
If you want to avoid explaining pure functions, then this seems to do the trick:
f @@ p
This Q&A is considered canonical and is used as a base for marking others [duplicate] so answers should cover the topic best.
It is another one way then: (thanks to rm -rf)
l = {a, b, c, s};
Operate[f &, l]
f[a, b, c, s]
but in such simple case f@@l is what I use.