Jeff Peters wrote: > Hi; > > I am trying to run a function inside a continuing loop, but do not seem > to be able to pass any parameters (arguments ) when I do so. > I have placed working and non-working code , with output below. > > ## This works: > > def loop(fn ): > for i in range(5): > fn( ) > > def this_function(a=" i am not a string"): > print( a ) > > loop(this_function) > > ## with output: > >>> > i am not a string > i am not a string > i am not a string > i am not a string > i am not a string > >>> > > ## But , this does not : > > def loop(fn ): > for i in range(5): > fn( ) > > def this_function(a=" i am not a string"): > print( a ) > > loop(this_function("I am a string") ) ## note the only change is here
You are calling this_function() and then pass the result of the function call to your other function loop(). Instead you need another function that builds a function that calls this_function() with the desired argument: >>> def loop(f): ... for i in range(5): ... f() ... >>> def this_function(a): ... print(a) ... >>> def make_function(f, arg): ... def g(): ... f(arg) ... return g ... >>> loop(make_function(this_function, "foo")) foo foo foo foo foo >>> loop(make_function(this_function, "bar")) bar bar bar bar bar >>> Of course you could also change loop() to pass on arbitrary arguments: >>> def loop(f, *args, **kw): ... for i in range(3): ... f(*args, **kw) ... >>> loop(print, 1, 2) 1 2 1 2 1 2 >>> loop(print, 1, 2, sep="<-->") 1<-->2 1<-->2 1<-->2 Because building a function that just calls another function with some predefined arguments is a common need the standard library has functools.partial(): >>> from functools import partial >>> print42 = partial(print, 42) >>> print42() 42 >>> loop(print42) 42 42 42 Another variant is a lambda function with a default argument: >>> loop(lambda a="whatever": print(a)) whatever whatever whatever _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor