Is there a short way to call a function twice or more consecutively in Python? For example:
do()
do()
do()
maybe like:
3*do
You can use itertools.repeat with operator.methodcaller to call the __call__ method of the function N times. Here is an example of a generator function doing it:
from itertools import repeat
from operator import methodcaller
def call_n_times(function, n):
yield from map(methodcaller('__call__'), repeat(function, n))
Example of usage:
import random
from functools import partial
throw_dice = partial(random.randint, 1, 6)
result = call_n_times(throw_dice, 10)
print(list(result))
# [6, 3, 1, 2, 4, 6, 4, 1, 4, 6]
Here is an approach that doesn't require the use of a for
loop or defining an intermediate function or lambda function (and is also a one-liner). The method combines the following two ideas:
calling the iter() built-in function with the optional sentinel argument, and
using the itertools recipe for advancing an iterator n
steps (see the recipe for consume()
).
Putting these together, we get:
next(islice(iter(do, object()), 3, 3), None)
(The idea to pass object()
as the sentinel comes from this accepted Stack Overflow answer.)
And here is what this looks like from the interactive prompt:
>>> def do():
... print("called")
...
>>> next(itertools.islice(iter(do, object()), 3, 3), None)
called
called
called
You could define a function that repeats the passed function N times.
def repeat_fun(times, f):
for i in range(times): f()
If you want to make it even more flexible, you can even pass arguments to the function being repeated:
def repeat_fun(times, f, *args):
for i in range(times): f(*args)
Usage:
>>> def do():
... print 'Doing'
...
>>> def say(s):
... print s
...
>>> repeat_fun(3, do)
Doing
Doing
Doing
>>> repeat_fun(4, say, 'Hello!')
Hello!
Hello!
Hello!
Hello!