<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def execute_script(self, script, g=None):
 """ Runs a script, returning the result. Parameters script String script to be evaluated (see below). g=None Optional dictionary of additional globals for the script evaluation. These will automatically be inserted into self.extra_globals. Usage ----- Scripts are of the form: "3.0 + x/y - d[0] where x=3.0*c('my_column')+h('setting'); y=d[1]" By default, "d" refers to the databox object itself, giving access to everything and enabling complete control over the universe. Meanwhile, c() and h() give quick reference to d.c() and d.h() to get columns and header lines. Additionally, these scripts can see all of the numpy functions like sin, cos, sqrt, etc. If you would like access to additional globals in a script, there are a few options in addition to specifying the g parametres. You can set self.extra_globals to the appropriate globals dictionary or add globals using self.insert_global(). Setting g=globals() will automatically insert all of your current globals into this databox instance. There are a few shorthand scripts available as well. You can simply type a column name such as 'my_column' or a column number like 2. However, I only added this functionality as a shortcut, and something like "2.0*a where a=my_column" will not work unless 'my_column is otherwise defined. I figure since you're already writing a complicated script in that case, you don't want to accidentally shortcut your way into using a column instead of a constant! Use "2.0*a where a=c('my_column')" instead. """


        # add any extra user-supplied global variables for the eventual eval() call.
        if not g==None: self.extra_globals.update(g)

        # If the script is not a list of scripts, return the script value.
        # This is the termination of a recursive call.
        if not _s.fun.is_iterable(script):

            # special case
            if script is None: return None

            # get the expression and variables dictionary
            [expression, v] = self._parse_script(script)

            # if there was a problem parsing the script
            if v is None:
                print("ERROR: Could not parse '"+script+"'")
                return None

            # get all the numpy stuff too
            g = self._globals()
            g.update(v)

            # otherwise, evaluate the script using python's eval command
            return eval(expression, g)

        # Otherwise, this is a list of (lists of) scripts. Make the recursive call.
        output = []
        for s in script: output.append(self.execute_script(s))

        return output