python - 迭代生成器时调用 iter 和 next

标签 python iterator generator yield

我正在编写一个函数,它接受一个迭代器、一个 int 和一个填充,如果迭代的值少于 n 个值,则在末尾添加一个填充。我能够让该函数完全针对迭代器参数运行不是生成器类型,如果是生成器类型,则会引发打字错误异常,我将在该代码块中处理生成器。问题是我能够生成生成器内的所有值,但由于外部 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 值

最佳答案

我认为尝试 __getitem__ 没有任何好处方法并回到迭代器协议(protocol)。只需使用可迭代,这甚至是变量的名称!

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??'

关于python - 迭代生成器时调用 iter 和 next,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23331585/

相关文章:

c++ - 迭代并删除 std::set 中的元素

c++ - 这是 boost::iterator_facade 的 boost::range_detail::demote_iterator_traversal_tag 中的错误吗?

html - 如何从 2 个列表中选择随机行并将它们组合起来

python - Keras 预测精度与训练精度不匹配

python - Pandas :按集合中包含的字段过滤

python - 无法终止/终止子进程

Python:copy.deepcopy 产生错误

即使我的路径是正确的,Sublime3 也无法识别 Python?

ruby - 这个 ruby 迭代器棘手的干净解决方案?

python - Django 查询集和生成器