code: def remove_objects(self, bucket_name, objects_iter):
          
          is_valid_bucket_name(bucket_name)
          if isinstance(objects_iter, basestring):
              raise TypeError(
                  'objects_iter cannot be `str` or `bytes` instance. It must be '
                  'a list, tuple or iterator of object names'
              )
  
          # turn list like objects into an iterator.
          objects_iter = itertools.chain(objects_iter)
  
          obj_batch = []
          exit_loop = False
          while not exit_loop:
              try:
                  object_name = next(objects_iter)
                  is_non_empty_string(object_name)
              except StopIteration:
                  exit_loop = True
  
              if not exit_loop:
                  obj_batch.append(object_name)
  
              # if we have 1000 items in the batch, or we have to exit
              # the loop, we have to make a request to delete objects.
              if len(obj_batch) == 1000 or (exit_loop and len(obj_batch) > 0):
                  # send request and parse response
                  errs_result = self._process_remove_objects_batch(
                      bucket_name, obj_batch
                  )
  
                  # return the delete errors.
                  for err_result in errs_result:
                      yield err_result
  
                  # clear batch for next set of items
                  obj_batch = []
docs: Removes multiple objects from a bucket.
  
          :param bucket_name: Bucket from which to remove objects
  
          :param objects_iter: A list, tuple or iterator that provides
          objects names to delete.
  
          :return: An iterator of MultiDeleteError instances for each
          object that had a delete error.