7

下面的代码可以正常工作:

def file_gen(f_name):
    f = open(f_name)
    for line in f:
        yield line

gen_line = file_gen("foo.html")
gen_line.next() # '<!DOCTYPE>\n'
gen_line.next() # '<html> \n' 
gen_line.next() # ... next line in file 

但是这个功能提高了StopIteration。我不明白为什么?

def file_gen(f_name):
    f = open(f_name)
    line = f.readline()
    yield line

gen_line = file_gen('foo.html')
gen_line.next()  # '<!DOCTYPE>\n'
gen_line.next()  # StopIteration
4

4 回答 4

6

你有:

def file_gen(f_name):
    f = open(f_name)
    line = f.readline()
    yield line

注意line = f.readline()这只会从文件中读取 1 行。

相比:

def g(x):
    li=range(x)
    yield li.pop()

print list(g(10))
# [9]

有了这个:

def g(x):
    li=range(x)
    while li:
       yield li.pop()

print list(g(10))
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

yield只能用特定的对象或表达式调用一次。一旦它被接收器使用,它必须被重新生成。所以你需要一个循环来读取文件的每一行。

您可以通过这种方式使用您的第二种(可读性较差)表格:

def file_gen(f_name):
    f = open(f_name)
    while True:
        line = f.readline()
        if not line:
            break
        yield line

您需要一个循环来创建要产生的项目。在您的第一种情况下,for line in f: yield line是一个循环。

我会这样重写你的函数:

def file_gen(f_name):
    with open(f_name) as f:
        for line in f:
            yield line
于 2013-11-14T15:22:19.773 回答
2

您在第二个 next() 上获得了 StopIteration,因为您只产生了一个结果。你的意思是这样做吗?

def file_gen(f_name):
    f = open(f_name)
    lines = f.readlines()
    for line in lines:
        yield line
于 2013-11-14T15:24:21.547 回答
1

没有

line = f.readline()

只给你一根线就可以了?因此迭代在那之后停止......

于 2013-11-14T15:20:51.673 回答
0

强文本

def text_lines(path):
   textFile = open(path, "r")
   while True:
      line = textFile.readline()
      if line :
         yield line.strip()
      else:
         break
   textFile.close()
于 2021-01-20T02:24:41.780 回答