【问题标题】:Python function execution on iterator till empty在迭代器上执行 Python 函数直到为空
【发布时间】:2019-10-17 01:12:21
【问题描述】:

我有一个迭代器,我想在迭代器上执行函数,直到迭代器为空。我下面的方法是正确的还是有更好的做法?

import pandas as pd

df_iter = pd.read_csv(file_path, chunksize=some_chunksize_value)

def some_function(data):
    try:
        do sth with data.__next__()
        some_function(data)
    except StopIteration:
        do sth here
        return True

some_function(df_iter )

【问题讨论】:

  • next(df_iter) 也许,也不确定pd.read_csv 是否给你一个迭代器
  • 只需使用循环 (for item in df_iter) 迭代 df_iter,您不需要为此进行递归。
  • 它给了我一个带有块大小的迭代器。是的,下一个或 __next__() 但如何检查迭代器是否为空完成执行?
  • 我想避免 for 循环或 if 语句或任何其他嵌套逻辑。
  • “我想避免 for 循环”。为什么?没有它们,几乎不可能编写任何重要的程序。而且递归不是比循环更嵌套吗?

标签: python pandas csv iterator


【解决方案1】:

使用 for 循环。这将自动调用 next() 并在 StopIteration 上停止,您无需执行任何操作。

for item in df_iter:
    #do something with data here

您不需要为此使用递归,如果您的迭代器有超过 1000 个值的可能性,递归尤其不适合。然后你会在到达终点之前因“超出最大递归深度”而崩溃。


如果您处于函数式范式中,可以使用 map 将函数应用于可迭代对象,而无需显式的 for 循环。

map(do_thing, df_iter)

这将返回另一个可迭代对象,当您对其进行迭代时,它会在 df_iter 的每个元素上调用 do_thing。 (或者,在 Python 2.7 中,它会立即对每个元素调用 do_thing 并返回所有结果的列表)

这种方法比较少见,因为 for 循环、列表推导和/或生成器表达式可以用更简单的语法做同样的事情。

【讨论】:

  • 很好,没有看到那里的递归,尽管在 try catch 中执行next(df_iter) 也是额外的工作
猜你喜欢
  • 2017-11-19
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多