code: def d(self):
          r
          if self._d is None:
              if not self.is_directed():
                  # Shortcut for undirected graphs.
                  self._d = self.W.getnnz(axis=1)
                  # axis=1 faster for CSR (https://stackoverflow.com/a/16391764)
              else:
                  degree_in = self.W.getnnz(axis=0)
                  degree_out = self.W.getnnz(axis=1)
                  self._d = (degree_in + degree_out) / 2
          return self._d
docs: r"""The degree (number of neighbors) of vertices.
  
          For undirected graphs, the degree of a vertex is the number of vertices
          it is connected to.
          For directed graphs, the degree is the average of the in and out
          degrees, where the in degree is the number of incoming edges, and the
          out degree the number of outgoing edges.
  
          In both cases, the degree of the vertex :math:`v_i` is the average
          between the number of non-zero values in the :math:`i`-th column (the
          in degree) and the :math:`i`-th row (the out degree) of the weighted
          adjacency matrix :attr:`W`.
  
          Examples
          --------
  
          Undirected graph:
  
          >>> graph = graphs.Graph([
          ...     [0, 1, 0],
          ...     [1, 0, 2],
          ...     [0, 2, 0],
          ... ])
          >>> print(graph.d)  # Number of neighbors.
          [1 2 1]
          >>> print(graph.dw)  # Weighted degree.
          [1 3 2]
  
          Directed graph:
  
          >>> graph = graphs.Graph([
          ...     [0, 1, 0],
          ...     [0, 0, 2],
          ...     [0, 2, 0],
          ... ])
          >>> print(graph.d)  # Number of neighbors.
          [0.5 1.5 1. ]
          >>> print(graph.dw)  # Weighted degree.
          [0.5 2.5 2. ]