How do I call a function twice or more times consecutively?

后端 未结 9 1828
借酒劲吻你
借酒劲吻你 2020-12-05 00:02

Is there a short way to call a function twice or more consecutively in Python? For example:

do()
do()
do()

maybe like:

3*do         


        
相关标签:
9条回答
  • 2020-12-05 00:36

    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]
    
    0 讨论(0)
  • 2020-12-05 00:41

    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
    
    0 讨论(0)
  • 2020-12-05 00:43

    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!
    
    0 讨论(0)
提交回复
热议问题