python yield

yield

如果不使用 yield,一般会这么写.
然后使用 这个列表的时候,还需要再迭代一遍。
这样效率又低,又占用了内存。

def find_even():
    for i in range(10):
        if i % 2 == 0:
            yield i


def find_even2():
        result = []
    for i in range(10):
        if i % 2 == 0:
            result.append(i)
    return result


if __name__ == '__main__':
    for i in find_even2():
        print(i)

另外,yield 一个很神奇的地方是,生成器执行的时候,遇到 yield 会挂起像 return 一样返回值(这点是和 return 类似的地方),但是当再次执行的执行的时候会接着当时挂起的地方,继续往下执行。(这点是和 return 不同的地方)

如果真的理解了,可以想想下面这个 print 会执行几次,然后 debug 看一下。

def search2(lines, pattern, history=5):
    history_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
            yield line, history_lines
        history_lines.append(line)
        print(f"只是挂起,还是会执行的 {line}")


if __name__ == '__main__':
    with open(r"E:\package\package\request_rds\note\test_history.py") as f:
        for i in search2(f, "a"):
            print(i)
    

你可能感兴趣的:(python yield)