如何编写一个生成器,在Python中的iterable中返回ALL-BUT-LAST项?

bod*_*ydo 5 python

昨天我问了一些类似的问题[1,2],并得到了很好的答案,但我在技术上还不够熟练,自己写一个这样复杂的发电机.

如果它是最后一项,而不是让它产生,我怎么能写一个会引发StopIteration的生成器呢?

我想我应该以某种方式一次询问两个值,看看第二个值是否为StopIteration.如果是,那么我应该提高这个StopIteration而不是产生第一个值.但不知怎的,我还应该记住,如果不是StopIteration,我会问第二个值.

我不知道怎么写自己.请帮忙.

例如,如果iterable是[1,2,3],那么生成器应该返回1和2.

谢谢,Boda Cydo.

[1] 如何在Python中修改生成器?

[2] 如何确定Python生成器中的值是否为1-BUT-LAST?

Dav*_*rby 12

这应该做的伎俩:

def allbutlast(iterable):
    it = iter(iterable)
    current = it.next()
    for i in it:
        yield current
        current = i


>>> list(allbutlast([1,2,3]))
[1, 2]
Run Code Online (Sandbox Code Playgroud)

这将迭代整个列表,并返回前一项,以便永远不会返回最后一项.
请注意,在[]和[1]上调用上面的内容将返回一个空列表.