误解了python的产量

2024-03-28 11:10:18 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码工作正常:

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。我不明白为什么?在

^{pr2}$

Tags: 函数代码nameinforfoodefhtml
3条回答

在第二个next()上得到StopIteration,因为您只得到一个结果。你是不是故意要这么做?在

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

不是吗

line = f.readline()

只给你一条线让你屈服?因此,迭代在此之后停止。。。在

你有:

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

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

比较:

^{pr2}$

有了这个:

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

相关问题 更多 >