Why do Drupal core functions get node object instead of nid as argument?
I think it's to avoid the repetition of node_load that could occur. 

I searched a little in the source and you can see node_type_get_name($node) is called from others functions which also take a $node object argument, node_promote_action for exemple

function node_promote_action($node, $context = array()) {
  $node-&gt;promote = NODE_PROMOTED;
  watchdog('action', 'Promoted @type %title to front page.', array('@type' =&gt; node_type_get_name($node), '%title' =&gt; $node-&gt;title));
}


It seems DRY to me. Imagine you gave a nid as argument in node_promote_action :

function node_promote_action($nid, $context = array()) {
  $node = node_load($nid);
  $node-&gt;promote = NODE_PROMOTED;
  watchdog('action', 'Promoted @type %title to front page.', array('@type' =&gt; node_type_get_name($nid), '%title' =&gt; $node-&gt;title));
}


And then node_load again in node_type_get_name :

function node_type_get_name($nid) {
  $node = node_load($nid); // repetition
  $type = _node_extract_type($node);
  $types = _node_types_build()-&gt;names;
  return isset($types[$type]) ? $types[$type] : FALSE;
}


With nid as argument, each time a node related function (A) need to process some node's properties (often if not always), they would call node_load. This would lead to unnecessary repetition when another node processing function (B) is called inside the first (A), just like in the above example.