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)