【问题标题】:Python Generator call counter not increasing unless yield is called除非调用 yield,否则 Python Generator 调用计数器不会增加
【发布时间】:2016-06-12 22:17:38
【问题描述】:

我正在使用scandir 库来查看我计算机上的所有文件。一旦我检查了 100 条记录,我想停止循环。如果永远不会调用 yield 语句,我的变量 c 永远不会增加并且循环不会停止。我输入了一些虚假的文件名thisfilewontbefound,这些文件名永远不会被发现,因此永远不会到达yield。为什么c 不递增?

from scandir import scandir, walk
import sys

def subdirs(path):
    for path, folders, files in walk(path):
        for files in scandir(path):
            if 'thisfilewontbefound' in files.path:
                yield files.path

c = 0
for i in subdirs('C:\\'):
    if c > 100:
        print "test over"
        sys.exit()
    c += 1
    print i

【问题讨论】:

  • 因为subdirs 永远不会让步,所以for i in subdirs(...) 的主体永远不会运行。
  • @gill 不应该对 C:\ 中的每个文件夹进行交互吗?
  • @user2242044 如果文件不存在,子目录的第一次迭代将永远不会产生任何元素。
  • subdirs 仍然会迭代,但没有 yield-ing 任何东西可以迭代 for 循环,所以最后 for 循环永远不会运行

标签: python python-2.7 generator yield


【解决方案1】:

您的for 循环正在等待生成器。如果yield 被执行,生成器将产生一个值。但是yield 永远不会执行,因为没有这样的文件,所以for 循环将等待很长时间,直到您的C: 驱动器上的所有 文件都被扫描并且生成器结束时没有永远不会产生任何东西。

要么将计数器放在生成器中,要么不过滤生成器中的文件并让它更频繁地生成。

【讨论】:

  • 第二个建议是让它更频繁地产生,最好让生成器在效率方面进行过滤或 for 循环?
  • @user2242044:没有过滤器,你的生成器只不过是os.walk() 生成器的一个额外的空包装器。在那个时候拥有那个生成器真的没有任何意义。 :-)
猜你喜欢
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2020-10-19
  • 2013-03-02
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多