import itertools as it
def repeatfunc(func, args=(),times=None):
"""
Repeat calls to func with specified arguments.
Example: repeatfunc(random.random)
"""
if times is None:
return it.starmap(func, it.repeat(args))
return it.starmap(func, it.repeat(args, times))
它可以被称为:
repeatfunc(func,(arg1,arg2,...,argN),times=4) #repeat 4 times
repeatfunc(func,(arg1,arg2,...)) #repeat infinitely
而不是来自itertools的普通版本:
repeatfunc(func,4,arg1,arg2,...) #repeat 4 times
repeatfunc(func,None,arg1,arg2,...) #repeat infinitely
每当我看到
iter
有2个参数时,我都需要从头开始查阅文档,以确定到底发生了什么。正因为如此,我可能会自己动手:或者,正如Jon Clements在评论中所述,您可以使用
^{pr2}$itertools.repeatfunc
方法,它也允许您将参数传递给函数:虽然我认为函数签名
def repeatfunc(func,times=None,*args)
有点尴尬。我更喜欢将元组作为args传递(在我看来,它更显式,“显式优于隐式”):它可以被称为:
而不是来自
itertools
的普通版本:你想要一个迭代器,它能不断地产生值,直到你停止向它请求新值为止?简单使用
它对每个迭代步骤调用
function()
,直到结果== sentinel
。在所以选择一个永远不能被你想要的函数返回的sentinel,比如
^{pr2}$None
。在如果您想监视计算机上的某些状态,可以这样做
反过来,它对每个迭代步骤无限调用
getstate()
。在但是要小心函数返回
None
作为有效值!在这种情况下,您应该选择一个保证唯一的sentinel,可能是为这个作业创建的对象:相关问题 更多 >
编程相关推荐