import functools
funcs = {"Add": lambda a, b: a + b,
"Subtract": lambda a, b: a - b,
"Multiply": lambda a, b: a * b,
"Divide": lambda a, b: a / b}
def do_operation(name, func, a, b):
print(name, ":", func(a, b))
# As you can see, putting functions into a list like this does not work; it just calls the last function repeatedly.
# This is because all of the lambdas are pointing to the same location for "name" and "func", which are overwritten
# on each iteration until they have the values of the last item iterated.
exec_list = []
for name, func in funcs.items():
exec_list.append(lambda: do_operation(name, func, 3, 5))
for e in exec_list:
e()
print()
# You can avoid this by using the 'functools' library, which also offers a more comprehensible syntax, akin to a C++
# 'std::bind' one.
exec_list = []
for name, func in funcs.items():
exec_list.append(functools.partial(do_operation, name, func, 3, 5))
for e in exec_list:
e()
aW1wb3J0IGZ1bmN0b29scwoKZnVuY3MgPSB7IkFkZCI6ICAgICAgbGFtYmRhIGEsIGI6IGEgKyBiLAogICAgICAgICAiU3VidHJhY3QiOiBsYW1iZGEgYSwgYjogYSAtIGIsCiAgICAgICAgICJNdWx0aXBseSI6IGxhbWJkYSBhLCBiOiBhICogYiwKICAgICAgICAgIkRpdmlkZSI6ICAgbGFtYmRhIGEsIGI6IGEgLyBifQoKZGVmIGRvX29wZXJhdGlvbihuYW1lLCBmdW5jLCBhLCBiKToKICAgIHByaW50KG5hbWUsICI6IiwgZnVuYyhhLCBiKSkKCiMgQXMgeW91IGNhbiBzZWUsIHB1dHRpbmcgZnVuY3Rpb25zIGludG8gYSBsaXN0IGxpa2UgdGhpcyBkb2VzIG5vdCB3b3JrOyBpdCBqdXN0IGNhbGxzIHRoZSBsYXN0IGZ1bmN0aW9uIHJlcGVhdGVkbHkuCiMgVGhpcyBpcyBiZWNhdXNlIGFsbCBvZiB0aGUgbGFtYmRhcyBhcmUgcG9pbnRpbmcgdG8gdGhlIHNhbWUgbG9jYXRpb24gZm9yICJuYW1lIiBhbmQgImZ1bmMiLCB3aGljaCBhcmUgb3ZlcndyaXR0ZW4KIyBvbiBlYWNoIGl0ZXJhdGlvbiB1bnRpbCB0aGV5IGhhdmUgdGhlIHZhbHVlcyBvZiB0aGUgbGFzdCBpdGVtIGl0ZXJhdGVkLgpleGVjX2xpc3QgPSBbXQpmb3IgbmFtZSwgZnVuYyBpbiBmdW5jcy5pdGVtcygpOgogICAgZXhlY19saXN0LmFwcGVuZChsYW1iZGE6IGRvX29wZXJhdGlvbihuYW1lLCBmdW5jLCAzLCA1KSkKICAgIApmb3IgZSBpbiBleGVjX2xpc3Q6CiAgICBlKCkKCgpwcmludCgpCiMgWW91IGNhbiBhdm9pZCB0aGlzIGJ5IHVzaW5nIHRoZSAnZnVuY3Rvb2xzJyBsaWJyYXJ5LCB3aGljaCBhbHNvIG9mZmVycyBhIG1vcmUgY29tcHJlaGVuc2libGUgc3ludGF4LCBha2luIHRvIGEgQysrCiMgJ3N0ZDo6YmluZCcgb25lLgpleGVjX2xpc3QgPSBbXQpmb3IgbmFtZSwgZnVuYyBpbiBmdW5jcy5pdGVtcygpOgogICAgZXhlY19saXN0LmFwcGVuZChmdW5jdG9vbHMucGFydGlhbChkb19vcGVyYXRpb24sIG5hbWUsIGZ1bmMsIDMsIDUpKQogICAgCmZvciBlIGluIGV4ZWNfbGlzdDoKICAgIGUoKQ==