Как вызвать функцию два или более раз подряд в python?

есть ли короткий способ вызвать функцию дважды или более последовательно в python? Например:

do()
do()
do()

может, так :

3*do()

8 ответов


Я:

for _ in range(3):
    do()

на _ - это Соглашение для переменной, значение которой вас не волнует.

вы также можете увидеть некоторые люди пишут:

[do() for _ in range(3)]

однако это немного дороже, потому что он создает список, содержащий возвращаемые значения каждого вызова do() (даже если это None), а затем выбрасывает полученный список. Я бы не предложил использовать это, если вы are использование списка возврата ценности.


вы можете определить функцию, которая повторяет переданную функцию N раз.

def repeat_fun(times, f):
    for i in range(times): f()

Если вы хотите сделать его еще более гибким, вы даже можете передать аргументы повторяемой функции:

def repeat_fun(times, f, *args):
    for i in range(times): f(*args)

использование:

>>> 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!

простой цикл for?

for i in range(3):
  do()

или, если вы заинтересованы в результатах и хотите их собрать, с бонусом быть 1 лайнером:

vals = [do() for _ in range(3)]

три способа сделать это:

(I) я думаю, используя map также может быть опция, хотя требуется создание дополнительного списка с Nones в некоторых случаях и всегда нуждается в списке аргументов:

def do():
    print 'hello world'

l=map(lambda x: do(), range(10))

(II)itertools содержат функции, которые могут быть использованы для итерации через другие функции, а также https://docs.python.org/2/library/itertools.html

(III) использование списков функций пока не упоминалось, я думаю (и это на самом деле самый близкий по синтаксису к тому, который первоначально обсуждался):

it=[do]*10
[f() for f in it]

или как один лайнер:

[f() for f in [do]*10]

мои две копейки:

from itertools import repeat 

list(repeat(f(), x))  # for pure f
[f() for f in repeat(f, x)]  # for impure f

вот подход, который не требует использования for цикл или определение промежуточной функции или лямбда-функции (а также однострочной). Метод сочетает в себе следующие две идеи:

складывая их вместе, мы получаем:

next(islice(iter(do, object()), 3, 3), None)

(идея передать object() как часовой приходит от этой принятый ответ переполнения стека.)

и вот как это выглядит из интерактивной командной строки:

>>> def do():
...   print("called")
... 
>>> next(itertools.islice(iter(do, object()), 3, 3), None)
called
called
called

from itertools import repeat, starmap

results = list(starmap(do, repeat((), 3)))

посмотреть repeatfunc рецепт из модуля itertools, который на самом деле намного мощнее. Если вам нужно просто вызвать метод, но не заботитесь о возвращаемых значениях, вы можете использовать его в цикле for:

for _ in starmap(do, repeat((), 3)): pass

но это становится уродливым.


вы можете попробовать цикл while, как показано ниже;

def do1():
    do something 
def do2():
    x=0
    while x<n:
        do1()
        x=x+1
do2()

таким образом, вызовите функцию do1 n раз.