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特定のオブジェクトまたは式で一度だけ呼び出すことができます。受信側で使用されたら、再生成する必要があります。そのため、ファイルの各行を読み取るループが必要です。

2 番目の (読みにくい) フォームを次のように使用できます。

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 に答える