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

Reply via email to