yield
如果不使用 yield,一般會這么寫.
然后使用 這個列表的時候,還需要再迭代一遍。
這樣效率又低,又占用了內(nèi)存。
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 一個很神奇的地方是,生成器執(zhí)行的時候,遇到 yield 會掛起像 return 一樣返回值(這點是和 return 類似的地方),但是當再次執(zhí)行的執(zhí)行的時候會接著當時掛起的地方,繼續(xù)往下執(zhí)行。(這點是和 return 不同的地方)
如果真的理解了,可以想想下面這個 print 會執(zhí)行幾次,然后 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"只是掛起,還是會執(zhí)行的 {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)