Array of functions
This problem was asked by Google.
What will this code print out?
def make_functions():
flist = []
for i in [1, 2, 3]:
def print_i():
print(i)
flist.append(print_i)
return flist
functions = make_functions()
for f in functions:
f()
How can we make it print out what we apparently want?
My Solution(C++):
/*
You can't have a function inside a function in cpp like python. But you do have
function pointers. So in essence, we can create a vector of pairs of function pointers
and their corresponding args as long as the dataytpes remain consistent.
After the creation of such a vector, running the individual functions is trivial.
*/
#include <iostream>
#include <vector>
void print_i(int i){
std::cout<<i<<'\n';
}
int main(){
std::vector<std::pair<void(*)(int), int>> func_args;
std::vector<int> A {1, 2, 3};
for (int i=0; i<A.size(); i++){
func_args.push_back(std::make_pair(print_i, A[i]));
}
for (auto p: func_args){
p.first(p.second);
}
return 0;
}
My Solution(Python):
print("buggy output")
def make_functions():
flist = []
for i in [1, 2, 3]:
def print_i():
print(i)
flist.append(print_i)
return flist
functions = make_functions()
for f in functions:
f()
print("method 1")
def print_i(i):
print(i)
def make_functions(func, args):
for arg in args:
func(arg)
make_functions(print_i, [1, 2, 3])
print("method 2")
def make_functions():
flist = []
for i in [1, 2, 3]:
def print_i(i):
print(i)
flist.append([print_i, i])
return flist
functions = make_functions()
print(functions)
for f, i in functions:
f(i)