使用next()一次手动生成一个项目(python 3)

使用next()一次手动生成一个项目(python 3),python,Python,我正在尝试使用os.walk()手动单步遍历windows文件夹/文件结构。我在Jupyter笔记本电脑公司工作。 如果我执行: next(os.walk(path)) next(g) 我第一次得到一个有意义的结果,但是每次执行该语句时,我都会得到完全相同的响应。 但是,如果我这样做: g=os.walk(path) next(g) 然后我每次执行时都会得到下一条逻辑记录: next(os.walk(path)) next(g) 请注意: 类型(g)和类型(操作系统行走(路径)) 返回

我正在尝试使用os.walk()手动单步遍历windows文件夹/文件结构。我在Jupyter笔记本电脑公司工作。 如果我执行:

next(os.walk(path))
next(g)
我第一次得到一个有意义的结果,但是每次执行该语句时,我都会得到完全相同的响应。 但是,如果我这样做:

g=os.walk(path)
next(g)
然后我每次执行时都会得到下一条逻辑记录:

next(os.walk(path))
next(g)
请注意: 类型(g)和类型(操作系统行走(路径)) 返回“生成器”

请解释为什么“next”的行为会因应用于g还是os而有所不同。walk()


谢谢--

因为每次调用
os.walk
,您都会得到一个新的生成器,它从顶部开始(或底部的
topdown=False
)。另一方面,如果在同一个生成器上重复调用
next
,则将遍历它生成的所有值


原则上,这与
范围
的操作没有区别<代码>下一步(范围(42))始终生成0。如果不是这样的话,
range
将毫无用处,因为无法知道范围(x):中i的给定
迭代将从何处开始。

因为每次调用
os.walk
,您都会得到一个从顶部开始的新生成器(或底部为
top-down=False
)。另一方面,如果在同一个生成器上重复调用
next
,则将遍历它生成的所有值


原则上,这与
范围
的操作没有区别<代码>下一步(范围(42))
始终生成0。如果不是这样的话,
range
将毫无用处,因为无法知道范围(x)中i的给定
迭代将从何处开始。

os.walk
是一个生成器函数。每次调用它时,它都返回一个新的iterable对象

当您编写
g=os.walk(path)
时,您将创建一个名为
g
的新iterable对象。每次调用
next(g)
时,迭代器都会执行一个步骤


编写
next(os.walk(path))
时,创建了一个新的iterable对象,但没有给它命名。您已调用过一次,但无法再次调用,因为它未绑定到名称。这就是区别。

os.walk
是一个生成器函数。每次调用它时,它都返回一个新的iterable对象

当您编写
g=os.walk(path)
时,您将创建一个名为
g
的新iterable对象。每次调用
next(g)
时,迭代器都会执行一个步骤


编写
next(os.walk(path))
时,创建了一个新的iterable对象,但没有给它命名。您已调用过一次,但无法再次调用,因为它未绑定到名称。这就是区别。

每次调用os.walk(path)
时,您都会创建一个新的生成器,它可以从第一个节点开始遍历路径中可访问的所有节点

当您执行
next(os.walk(path))

  • 创建一个新的生成器
  • 使用
    next
    从生成器中提取第一项
  • 删除生成器,该生成器随后会被垃圾收集并消失,以及您从中提取了多少项的任何知识
  • 重复
    next(os.walk(path))
    将返回到第1点,这将为您提供一个从第一个元素开始的新生成器
  • 当你做
    g=os.walk(路径)时;下一步(g)

  • 创建一个新的生成器
  • 将生成器存储在变量
    g
    中。这可以防止它被垃圾收集,并保留其内部状态
  • 从生成器中提取第一个元素(使用
    next
    )并提升其内部状态
  • 重复
    next(g)
    将获取刚刚使用的生成器中的下一项

  • 每次调用
    os.walk(path)
    时,都会创建一个新的生成器,该生成器可以从第一个节点开始遍历路径中可访问的所有节点

    当您执行
    next(os.walk(path))

  • 创建一个新的生成器
  • 使用
    next
    从生成器中提取第一项
  • 删除生成器,该生成器随后会被垃圾收集并消失,以及您从中提取了多少项的任何知识
  • 重复
    next(os.walk(path))
    将返回到第1点,这将为您提供一个从第一个元素开始的新生成器
  • 当你做
    g=os.walk(路径)时;下一步(g)

  • 创建一个新的生成器
  • 将生成器存储在变量
    g
    中。这可以防止它被垃圾收集,并保留其内部状态
  • 从生成器中提取第一个元素(使用
    next
    )并提升其内部状态
  • 重复
    next(g)
    将获取刚刚使用的生成器中的下一项

  • 非常感谢。我现在理解得更好了,但还是有点困惑,只是在更高的层次上。使用上面的示例,os.walk(path)、os.walk(path).\uu iter\uuu()和g都返回。相反,iterable上的_uiter _uu()通过返回将自身与iterable区分开来,因此您可以区分iterable和迭代器之间的区别。对于生成器,生成器和迭代器似乎都返回。难道不应该有办法区分这两者吗@保罗Cornelius@KevinC首先,不要使用
    whatever.\uuu iter\uuu()
    :首选
    iter(whatever)
    <代码>iter(…)检索与您提供的iter表相关的迭代器。如果您为它提供的已经是迭代器,那么
    iter
    只返回它的参数。生成器(您提到的
    只是实现迭代器的一种可能方式。换句话说,不要过多地阅读您的