code: def basis_function(degree, knot_vector, span, knot):
      
      left = [0.0 for _ in range(degree + 1)]
      right = [0.0 for _ in range(degree + 1)]
      N = [1.0 for _ in range(degree + 1)]  # N[0] = 1.0 by definition
  
      for j in range(1, degree + 1):
          left[j] = knot - knot_vector[span + 1 - j]
          right[j] = knot_vector[span + j] - knot
          saved = 0.0
          for r in range(0, j):
              temp = N[r] / (right[r + 1] + left[j - r])
              N[r] = saved + right[r + 1] * temp
              saved = left[j - r] * temp
          N[j] = saved
  
      return N
docs: Computes the non-vanishing basis functions for a single parameter.
  
      Implementation of Algorithm A2.2 from The NURBS Book by Piegl & Tiller.
  
      :param degree: degree, :math:`p`
      :type degree: int
      :param knot_vector: knot vector, :math:`U`
      :type knot_vector: list, tuple
      :param span: knot span, :math:`i`
      :type span: int
      :param knot: knot or parameter, :math:`u`
      :type knot: float
      :return: basis functions
      :rtype: list