函数用于重复调用函数?

2024-10-01 11:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑假设函数repeatcall,该函数以无参数可调用func和正整数n作为参数,并返回一个列表,其成员通过执行func()n次获得。它支持无限多愚蠢的hijinks,比如:

>>> repeatcall(lambda: id(dict()), 5)
[45789920, 45788064, 45807216, 45634816, 45798640]

>>> urandom = lambda: struct.unpack('Q', open('/dev/urandom').read(8))[0]
>>> repeatcall(urandom, 3)
[3199039843823449742, 14990726001693341311L, 11583468019313082272L]

>>> class Counter(itertools.count): __call__ = itertools.count.next
>>> repeatcall(Counter(100, -2), 4)
[100, 98, 96, 94]

我可以发誓,我在python2.x标准库中见过类似repeatcall的函数,但是我找不到它。如果我没有梦到这一点,那么在标准库中的哪里可以找到它?在

PS:我知道自己动手是件小事,但我讨厌重新发明轮子,尤其是那些已经在标准库中的轮子。我不是在问我如何掷骰子。

编辑:让它变得更加明确,我没有问如何编码repeatcall。在


Tags: lambda函数列表参数标准countcounter成员
3条回答

这是不存在的一个原因:编写一个不在每次调用时使用参数并返回新值的函数的惯用方法是将其编码为生成器。在

然后,您可以使用列表理解或生成器表达式任意调用它:[next(gen) for i in xrange(5)]。更好的是,gen本身可以是类似(id(dict()) for i in (itertools.repeat(None)))的生成器表达式的结果。在

因此,python没有库支持,因为它在语法上支持它。

你的意思是这样吗?公司名称:

>> from random import random
>> print [random() for x in range(5)]
[0.015015074309405185,
 0.7877023608913573,
 0.2940706206824023,
 0.7140457069245207,
 0.07868376815555878]

看起来够简洁的不是吗?在

您在标准库文档中看到了这一点,而不是标准库本身。在

它来自^{} recipes

def repeatfunc(func, times=None, *args):
    """Repeat calls to func with specified arguments.

    Example:  repeatfunc(random.random)
    """
    if times is None:
        return starmap(func, repeat(args))
    return starmap(func, repeat(args, times))

它允许参数,并且(理论上)应该比列表理解更好,因为func只需要查找一次。repeat也比range快,因为你实际上不使用计数器。在

相关问题 更多 >