<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def remove_columns(self, column_names, inplace=False):
 """ Returns an SFrame with one or more columns removed. If inplace == False (default) this operation does not modify the current SFrame, returning a new SFrame. If inplace == True, this operation modifies the current SFrame, returning self. Parameters column_names : list or iterable A list or iterable of column names. inplace : bool, optional. Defaults to False. Whether the SFrame is modified in place. Returns ------- out : SFrame The SFrame with given columns removed. Examples -------- +----+ | id | +----+ | 1 | | 2 | | 3 | +----+ [3 rows x 1 columns] """

        column_names = list(column_names)
        existing_columns = dict((k, i) for i, k in enumerate(self.column_names()))

        for name in column_names:
            if name not in existing_columns:
                raise KeyError('Cannot find column %s' % name)

        # Delete it going backwards so we don't invalidate indices
        deletion_indices = sorted(existing_columns[name] for name in column_names)

        if inplace:
            ret = self
        else:
            ret = self.copy()

        for colid in reversed(deletion_indices):
            with cython_context():
                ret.__proxy__.remove_column(colid)

        ret._cache = None
        return ret