我写了一个生成器,但是没有执行(第5行没有在my_func
中执行,而是在第17行生成了一个生成器对象)。
在调试模式下,即使调试器也没有执行第5行的第一个调试点。
我想知道我的代码如何在不进入相应功能my_func
的情况下生成“生成器对象”。
我的代码:
import time
import os
def my_func(fileName,data):
print("generator Started") # line 5
with open(fileName,'r') as f:
for line in f:
data = line.split(",")
if data in (data[0]):
yield line
def calling_func():
start = time.time()
dirName = "D:\\Datasets"
filName = "data.txt"
fileName = os.path.join(dirName,filName)
keyword1 = 49
data = my_func(fileName,keyword1) # line 17
print(x for x in data)
print("time taken ----=>",(time.time() - start))
if __name__ == "__main__":
calling_func()
答案 0 :(得分:0)
这是生成器的确切目的。
来自https://www.programiz.com/python-programming/generator:
如果一个函数至少包含一个
yield
语句(它可能包含 其他yield
或return
语句),它将成为生成器函数。yield
和return
都将从函数返回一些值。
由于my_func
使用yield
,因此该函数是生成器。
区别在于,尽管
return
语句终止了一个函数 完全,yield
语句暂停该函数并保存其所有状态 然后从那里继续接听电话。
调用data = my_func(fileName,keyword1)
时,您创建了一个生成器(“生成器对象”)。
现在,当您在print(x for x in data)
中进行迭代时,每次迭代将执行my_func
,直到my_func
被终止为止。