生成器试题

实现tail命令功能

import time


def tail(filename):
    f = open(filename)
    f.seek(0, 2) #从文件末尾算起
    while True:
        line = f.readline()  # 读取文件中新的文本行
        if not line:
            time.sleep(0.1)
            continue
        yield line

tail_g = tail('tmp')
for line in tail_g:
    print(line)

使用echo写内容到文件测试

send

def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total/count


g_avg = averager()
next(g_avg)
print(g_avg.send(10))
print(g_avg.send(30))
print(g_avg.send(5))

结果

10.0
20.0
15.0

结果为何

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))

打印结果为

[0, 1, 2, 3]
[]

g1=(i for i in g)
# g1 为生成器 ,此时为空,所以g2 为空
g2=(i for i in g1)

结果为何? (二)

def add(n, i):
    return n+i


def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))

结果

[20, 21, 22, 23]

原因

n = 10
i = 10
n + i = 20

n = 10
i = 11
n + i = 21
...