I ran into this problem many years ago when I was learning Mathematica. I came up with this solution, which I've since learned has some drawbacks. However, for many uses, it's perfectly fine and convenient, and the drawbacks have no impact on performance. It takes advantage of polymorphism.
ClearAll[F];
F[{x_, y_, z_}] := F[x, y, z]; (* define F for a point *)
F[x_, y_, z_] := {2 y Cos[z], Exp[x] Sin[z], x Exp[y]}; (* 3-variable function *)
Note that the value F[point] is defined in terms of F[x, y, z], so that if you need to change the formula for F, you just need to change it in one place.
Since I was teaching multivariable calculus back then, I used this all the time. There are two main drawbacks, one which applies only to versions since V4 with the introduction of packed arrays. Since V4, my use of this approach has diminished. The other drawback has to do with the Listability of mathematical expression such as 2 y Cos[z], etc. If you don't use F on lists of points or separate lists of coordinates, then this won't matter. My applications of Mathematica to teaching did not use Listability, so everything worked fine.
It is possible to deal with the Listability problem, at least for rectangular arrays, as follows:
ClearAll[F];
F[a_?ArrayQ] /; Last@Dimensions[a] == 3 :=
Transpose[
F @@ Transpose[a, RotateLeft@Range@ArrayDepth[a]],
RotateRight@Range@ArrayDepth[a]];
F[x_, y_, z_] := {2 y Cos[z], Exp[x] Sin[z], x Exp[y]}; (* 3-variable function *)
Examples:
F[1., 2., 3.]
(* {-3.95997, 0.383604, 7.38906} *)
F[{1., 2., 3.}]
(* {-3.95997, 0.383604, 7.38906} *)
F[ConstantArray[{1., 2., 3.}, {2, 2}]]
(* {{{-3.95997, 0.383604, 7.38906}, {-3.95997, 0.383604, 7.38906}},
{{-3.95997, 0.383604, 7.38906}, {-3.95997, 0.383604, 7.38906}}}
*)
To some extent, this takes advantage of packed arrays at the expense of two transposes and one unpacking to level 1.
Out[51]= {6 Sin[t], 0, 3 E^(3 Sin[t]) Cos[t]}`
– Daniel Lichtblau Jan 13 '21 at 14:38