使用next()一次手动生成一个项目(python 3)
我正在尝试使用os.walk()手动单步遍历windows文件夹/文件结构。我在Jupyter笔记本电脑公司工作。 如果我执行:使用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)和类型(操作系统行走(路径)) 返回
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
只返回它的参数。生成器(您提到的
只是实现迭代器的一种可能方式。换句话说,不要过多地阅读您的