python 迭代器 函数中

2024-04-29 21:09:13 发布

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

从函数创建无限迭代器的idiomatic方法是什么?例如

from itertools import islice
import random
rand_characters = to_iterator( random.randint(0,256) )
print ' '.join( islice( rand_characters, 100))

会产生100个随机数


Tags: to方法函数fromimportrandomprintjoin
2条回答

每当我看到iter有2个参数时,我都需要从头开始查阅文档,以确定到底发生了什么。正因为如此,我可能会自己动手:

def call_forever(callback):
    while True:
        yield callback()

或者,正如Jon Clements在评论中所述,您可以使用itertools.repeatfunc方法,它也允许您将参数传递给函数:

^{pr2}$

虽然我认为函数签名def repeatfunc(func,times=None,*args)有点尴尬。我更喜欢将元组作为args传递(在我看来,它更显式,“显式优于隐式”):

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

你想要一个迭代器,它能不断地产生值,直到你停止向它请求新值为止?简单使用

it = iter(function, sentinel)

它对每个迭代步骤调用function(),直到结果== sentinel。在

所以选择一个永远不能被你想要的函数返回的sentinel,比如None。在

^{pr2}$

如果您想监视计算机上的某些状态,可以这样做

iter_mystate = iter(getstate, None)

反过来,它对每个迭代步骤无限调用getstate()。在

但是要小心函数返回None作为有效值!在这种情况下,您应该选择一个保证唯一的sentinel,可能是为这个作业创建的对象:

iter_mystate = iter(getstate, object())

相关问题 更多 >