Как вызвать функцию два или более раз подряд в 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
также может быть опция, хотя требуется создание дополнительного списка с None
s в некоторых случаях и всегда нуждается в списке аргументов:
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
цикл или определение промежуточной функции или лямбда-функции (а также однострочной). Метод сочетает в себе следующие две идеи:
вызов
iter()
встроенная функция С необязательным аргументом sentinel иС помощью
itertools
рецепт для продвижения итератораn
шаги (см. рецепт дляconsume()
).
складывая их вместе, мы получаем:
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 раз.