Python 误解

Python 误解,python,generator,yield,Python,Generator,Yield,下面的代码工作正常: 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 没有 line

下面的代码工作正常:

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 
没有

line = f.readline()
只给你一行让你屈服?因此,迭代在……之后停止。

您有:

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
def file_gen(f_name):
    with open(f_name) as f:
        for line in f:
            yield line
您需要一个循环来创建要生成的项。在第一种情况下,f中的线的
:屈服线
是一个循环

我会这样重写你的函数:

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

您在第二个next()上得到StopIteration,因为您只生成了一个结果。你是不是打算这样做

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

strong文本

def text_lines(path):
   textFile = open(path, "r")
   while True:
      line = textFile.readline()
      if line :
         yield line.strip()
      else:
         break
   textFile.close()

您希望发生什么?第二个错误实际上是Python中的语法错误(您不能缩进
yield
行)@6502抱歉,我已更正,但如果使用以下形式:file=open('foo.html')file.readline()file.readline()。。。当我尝试只给出第二行而不是第一行时,它并没有在第二行停止,然后在后续的next()调用中停止迭代,正如我所期望的那样。无论如何,看来你已经找到了问题的症结所在。…。@A.M.Sultanov:因为
line=f.readline()
只读取一行。你需要把它包装成某种形式的循环——或者是一个更可读的
for
循环的
while
循环,或者更具体地说,你只需要调用
yield
一次,所以对
next()
的下一次调用就到达了生成器的末尾。@chepner:是的——这是一个更好的陈述方式。