def genfunc(args, expr):
       exec 'def temp(%s): return %s' % (args, expr)      # def temp(args):..
       return temp                                        # sets local var

def imap(func, list):
       res = []
       for x in list: res.append(func(x))                 # run func on nodes
       return res

if __name__ == "__main__":
    def square(x): return x * x
    print imap(square, [1, 2, 3, 4])                      # [1, 4, 9, 16]
    print imap(genfunc('x', 'x * x'), [1, 2, 3, 4])       # [1, 4, 9, 16]
    print map(lambda x: x * x, [1, 2, 3, 4])              # [1, 4, 9, 16]
