First, I'll note that the
:Nn version is only useful for defining 'well-behaved'
expl3 functions: if we want
w-type arguments or to define document commands (inside
xparse), we have to use the
:Npn version. Thus it is quite possible to favour
:Nn but still use
:Npn in some places.
With that restriction in place, the two are functionally equivalent: both versions in the question give an identical outcome. There are though two differences in use. The first is that the
:Nn version has to work much harder than the
:Npn one to extract the signature. If you do a trace, there is a lot of code to do it, so the
:Nn version is slower. For most uses that isn't a big problem as they are being used a point-of-loading, and the actual time cost is small. However, if you are doing a definition at point of use (particularly in a 'tight' loop) then you'll want the
The main difference is thus one of appearance/style, and the team have provided both as code authors will have different views on this. For some people, the fact that
:Npn requires an explicit
#1, etc. will be seen a good thing, whereas for others this will be seen as making the code less clear compared to the auto-detection of the
:Nn version. There are arguments both ways here, and for this reason both versions are provided.