如何在python中连续两次或多次调用函数?

时间:2012-01-28 19:40:37

标签: python function shortcut sequential

在python中有两个或更多连续调用函数的简短方法吗?例如:

do()
do()
do()

也许像:

3*do()

9 个答案:

答案 0 :(得分:56)

我会:

for _ in range(3):
    do()

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

你可能也会看到有些人写道:

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

然而这稍微贵一点,因为它创建了一个列表,其中包含每个do()调用的返回值(即使它是None),然后抛弃结果列表。除非你 使用返回值列表,否则我不会建议使用它。

答案 1 :(得分:11)

您可以定义一个重复传递函数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!

答案 2 :(得分:5)

一个简单的for循环?

for i in range(3):
  do()

或者,如果您对结果感兴趣并希望收集它们,可以获得1个班轮的奖金:

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

答案 3 :(得分:4)

另外三种方式:

(I)我认为使用map也可能是一个选项,但在某些情况下需要生成一个带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]

答案 4 :(得分:4)

我的两分钱:

from itertools import repeat 

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

答案 5 :(得分:3)

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

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

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

(传递object()作为哨兵的想法来自this接受的Stack Overflow回答。)

以下是交互式提示中的内容:

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

答案 6 :(得分:1)

from itertools import repeat, starmap

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

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

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

但那变丑了。

答案 7 :(得分:0)

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

def do1():
    # Do something

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

do2(5)

因此,调用do1函数5次。

答案 8 :(得分:0)

您可以将itertools.repeatoperator.methodcaller结合使用,以调用函数 N 次的__call__方法。这是generator function这样做的示例:

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]