迭代生成器时调用 iter 和 next

Posted

技术标签:

【中文标题】迭代生成器时调用 iter 和 next【英文标题】:making calls to iter and next when iterating through a generator 【发布时间】:2014-06-13 10:31:31 【问题描述】:

我正在编写一个函数,如果迭代的值小于 n,则在末尾添加一个迭代器一个 int 和一个填充。不是类型生成器,如果是,它会引发 typerror 异常,我将在该代码块中处理生成器。问题是我能够在生成器内产生所有值,但由于外部 for 循环干扰,我无法找到在末尾添加填充的方法。我需要通过调用 iter 和 next 来实现这一点,我一直在玩,但它一直没有工作......这是这个功能不好解释

def n_with_pad(iterable,n,pad=None):

    for i in range(n):   
        try:
            yield iterable[i]

        except IndexError:
            yield pad

        except TypeError:
            for i in iterable: 
                yield i

所以我要调用这个函数如下

for i n_with_pad('function',3):
    print(i,end=' ')

我会打印:'f' 'u' 'n'

但是添加具有小于 n 值的可迭代的 pad 将打印如下

for i n_with_pad('abcdefg',10,'?'):
    print(i,end=' ')

'a'、'b'、'c'、'd'、'e'、'f'、'g'、'?'、'?'和'?'

对于第二个电话,我能够起床 'a'、'b'、'c'、'd'、'e'、'f'、'g' 使用我到目前为止的代码,但似乎无法添加 ???满足n值

【问题讨论】:

它在大多数情况下都可以正常工作,但是一旦在引发 typeerror 异常后它需要一个生成器对象,我就试图弄清楚如何添加传入的任何内容,以满足 n-参数中指定的值 你是否明确地试图避免itertools?因为这是chainislice 的单行代码。也许repeat 投入了很好的衡量,这取决于你想要什么。 是的,我试图阻止调用任何其他函数 【参考方案1】:

我认为尝试__getitem__ 方法并退回到迭代器协议没有任何好处。用iterable就行了,就是变量名!

def n_with_pad(iterable,n,pad=None):
    it = iter(iterable)
    for _ in range(n):   
        yield next(it,pad)

演示:

''.join(n_with_pad('function',3,pad='?'))
Out[6]: 'fun'

''.join(n_with_pad('function',10,pad='?'))
Out[7]: 'function??'

【讨论】:

以上是关于迭代生成器时调用 iter 和 next的主要内容,如果未能解决你的问题,请参考以下文章

python-迭代器(next(),iter()函数)和生成器(yield函数)

python-迭代器(next(),iter()函数)和生成器(yield函数)

python-迭代器(next(),iter()函数)和生成器(yield函数)

迭代器生成器可迭代对象

迭代器 生成器, 可迭代对象以及应用场景

迭代器和生成器