docs: def xfrange(stop, start=None, step=1.0):
      """Same as :func:`frange`, but generator-based instead of returning a
      list.
  
      >>> tuple(xfrange(1, 3, step=0.75))
      (1.0, 1.75, 2.5)
  
      See :func:`frange` for more details.
      """
      if not step:
          raise ValueError('step must be non-zero')
      if start is None:
          start, stop = 0.0, stop * 1.0
      else:
          # swap when all args are used
          stop, start = start * 1.0, stop * 1.0
      cur = start
      while cur < stop:
          yield cur
          cur += step