parameters: (self, position)
return_statement: return current.get_data()
docstring: returns node data without removing it.
              raise exception, if position is invalid.
docstring_summary: returns node data without removing it.
              raise exception, if position is invalid.
docstring_tokens: returns node data without removing it . raise exception if position is invalid .
function: def data_at(self, position):
          """ returns node data without removing it.
              raise exception, if position is invalid.
          """
          length = self.__len__()
          if position < 1 or position > length:
              raise ValueError("invalid position")
  
          current = self.head()
          for _ in range(1, position):
              current = current.get_next()
          return current.get_data()
function_tokens: def data_at ( self , position ) : length = self . __len__ ( ) if position < 1 or position > length : raise ValueError ( "invalid position" ) current = self . head ( ) for _ in range ( 1 , position ) : current = current . get_next ( ) return current . get_data ( )