在跟踪与python迭代器和生成器有关的函数时需要帮助

时间:2019-01-11 02:49:00

标签: python-3.x

def skip_last(iterator):

    prev = next(iterator)
    for item in iterator:
        yield prev
        prev = item

for row in skip_last(CSV_reader):
    print(row)
print("Completed")

我知道该功能应该跳过使用python csv模块读入CSV阅读器的文件的最后一行。只是无法可视化流程。任何帮助将不胜感激。

让我们假设我们有一个包含以下示例数据的文本文件,并且我们想调用skip_last函数以将文件中的所有行打印到标准输出中,并删除FOOTER记录。

ABC 123
DEF 456
GHI 789
FOOTER

1 个答案:

答案 0 :(得分:0)

prev = next(iterator)行读入迭代器的第一个元素。

循环for item in iterator:逐一遍历其余项目。但是请注意,它不会产生item。它产生prev,比item落后一个元素。

分配prev = item保持滞后。完成迭代器后(通过 last 行进行迭代),您的生成器就落后了一个元素(产生了倒数第二个行)。

您可以创建一个previtem的表,当yield发生时:

 prev       item
-------------------
ABC 123    DEF 456
DEF 456    GHI 789
GHI 789    FOOTER

基本上,当item到达最后一个元素FOOTER时,迭代停止,但是到那时prev产生了倒数第二个元素{{1} }。