55

有没有一种捷径可以在 Python 中连续调用一个函数两次或更多次?例如:

do()
do()
do()

也许像:

3*do()
4

9 回答 9

97

我会:

for _ in range(3):
    do()

_是您不关心其值的变量的约定。

您可能还会看到一些人写道:

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

但是,这会稍微贵一些,因为它会创建一个包含每次调用的返回值的列表do()(即使它是None),然后丢弃结果列表。除非您使用返回值列表,否则我不建议使用它。

于 2012-01-28T19:43:32.220 回答
20

您可以定义一个将传递的函数重复 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!
于 2012-01-28T19:50:10.520 回答
9

另外三种方法:

(I) 我认为 usingmap也可能是一种选择,尽管在某些情况下需要生成一个带有 s 的附加列表,None并且总是需要一个参数列表:

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]
于 2016-03-15T11:01:10.013 回答
8

一个简单的for循环?

for i in range(3):
  do()

或者,如果您对结果感兴趣并想收集它们,那么您可以成为 1 班轮:

vals = [do() for _ in range(3)]
于 2012-01-28T19:43:14.670 回答
5

我的两分钱:

from itertools import repeat 

list(repeat(f(), x))  # for pure f
[f() for f in repeat(f, x)]  # for impure f
于 2017-01-14T14:49:21.383 回答
4

这是一种不需要使用for循环或定义中间函数或 lambda 函数(并且也是单线)的方法。该方法结合了以下两种思想:

把这些放在一起,我们得到:

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

(作为哨兵传递的想法object()来自这个公认的 Stack Overflow 答案。)

这是交互式提示中的样子:

>>> def do():
...   print("called")
... 
>>> next(itertools.islice(iter(do, object()), 3, 3), None)
called
called
called
于 2016-10-28T09:22:05.917 回答
2
from itertools import repeat, starmap

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

请参阅 itertools 模块中的repeatfunc配方,它实际上更强大。如果您只需要调用该方法但不关心返回值,您可以在 for 循环中使用它:

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

但这越来越难看。

于 2017-06-09T19:44:59.380 回答
0

您可以使用itertools.repeatwithoperator.methodcaller调用__call__函数的方法N次。这是执行此操作的生成器函数的示例:

from itertools import repeat
from operator import methodcaller


def call_n_times(function, n):
    yield from map(methodcaller('__call__'), repeat(function, n))

使用示例:

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]
于 2019-06-12T13:22:37.663 回答
0

您可以尝试如下所示的while循环;

def do1():
    # Do something

def do2(x):
    while x > 0:
        do1()
        x -= 1

do2(5)

因此调用 do1 函数 5 次。

于 2017-05-10T11:54:09.567 回答