考虑假设函数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
。在
这是不存在的一个原因:编写一个不在每次调用时使用参数并返回新值的函数的惯用方法是将其编码为生成器。在
然后,您可以使用列表理解或生成器表达式任意调用它:
[next(gen) for i in xrange(5)]
。更好的是,gen
本身可以是类似(id(dict()) for i in (itertools.repeat(None)))
的生成器表达式的结果。在因此,python没有库支持,因为它在语法上支持它。
你的意思是这样吗?公司名称:
看起来够简洁的不是吗?在
您在标准库文档中看到了这一点,而不是标准库本身。在
它来自^{} recipes :
它允许参数,并且(理论上)应该比列表理解更好,因为
func
只需要查找一次。repeat
也比range
快,因为你实际上不使用计数器。在相关问题 更多 >
编程相关推荐