'Return an iterator for (node, degree) in the dense graph.
The node degree is the number of edges adjacent to the node.
Parameters
nbunch : iterable container, optional (default=all nodes)
A container of nodes.  The container will be iterated
through once.
weight : string or None, optional (default=None)
The edge attribute that holds the numerical value used
as a weight.  If None, then each edge has weight 1.
The degree is the sum of the edge weights adjacent to the node.
Returns
nd_iter : iterator
The iterator returns two-tuples of (node, degree).
See Also
degree
Examples
>>> G = nx.path_graph(4) # or DiGraph, MultiGraph, MultiDiGraph, etc
>>> list(G.degree(0)) # node 0 with degree 1
[(0, 1)]
>>> list(G.degree([0,1]))
[(0, 1), (1, 2)]'

def degree(self, nbunch=None, weight=None):

    if (nbunch is None):
        nodes_nbrs = ((n, {v: self.all_edge_dict for v in ((set(self.adj) - set(self.adj[n])) - set([n]))}) for n in self.nodes())
    elif (nbunch in self):
        nbrs = ((set(self.nodes()) - set(self.adj[nbunch])) - {nbunch})
        return len(nbrs)
    else:
        nodes_nbrs = ((n, {v: self.all_edge_dict for v in ((set(self.nodes()) - set(self.adj[n])) - set([n]))}) for n in self.nbunch_iter(nbunch))
    if (weight is None):
        return ((n, len(nbrs)) for (n, nbrs) in nodes_nbrs)
    else:
        return ((n, sum((nbrs[nbr].get(weight, 1) for nbr in nbrs))) for (n, nbrs) in nodes_nbrs)
