在python函数中使用yield、print和return
有人能帮我找出我做错了什么吗在python函数中使用yield、print和return,python,Python,有人能帮我找出我做错了什么吗 def SeeIfExactRangeIsFound(): with open(logfile) as input_data: mylist = [] for line in input_data: if BeginSearchDVar in line: # Or whatever test is needed print line.strip()
def SeeIfExactRangeIsFound():
with open(logfile) as input_data:
mylist = []
for line in input_data:
if BeginSearchDVar in line: # Or whatever test is needed
print line.strip()
#mylist.append((line.strip()))
#return mylist
break
for line in input_data: # This keeps reading the file
if line.strip() == EndinSearchD:
break
print line
#mylist.append((line))
#return mylist
#SeeIfExactRangeIsFound()
LRange = SeeIfExactRangeIsFound()
print LRange
我循环浏览一个文件,只打印出该文件的部分。如中所示,当在正在读取的行中发现特定模式时,我开始打印日志文件的内容。并继续打印第一行之后的所有行,直到找到包含EndingSearchD变量中找到的模式的行
这和印刷品是一样的。但正如您所看到的,我想将SeeIfExactRangeIsFound函数的输出存储在一个变量中,然后使用该变量的内容
我的问题是,尽管我试图用不同的方法来实现我的目标,但似乎没有一种效果。我觉得我很接近答案,但我花了两个小时在这个问题上,无法找到答案
有什么想法吗?你几乎就知道了,但是你的返回声明不在正确的范围内:
def SeeIfExactRangeIsFound():
with open(logfile) as input_data:
mylist = []
for line in input_data:
if BeginSearchDVar in line: # Or whatever test is needed
print line.strip()
mylist.append((line.strip()))
break
for line in input_data: # This keeps reading the file
if line.strip() == EndinSearchD:
break
print line
mylist.append((line))
return mylist
作为奖励,您可以轻松地将其转换为生成器:
def SeeIfExactRangeIsFound():
with open(logfile) as input_data:
for line in input_data:
if BeginSearchDVar in line: # Or whatever test is needed
yield line.strip()
for line in input_data: # This keeps reading the file
if line.strip() == EndinSearchD:
break
yield line
然后像这样消费:
results = [x for x in def SeeIfExactRangeIsFound()]
与您的描述而不是代码匹配的版本 当找到特定的模式时,我开始打印日志文件的内容 在正在阅读的行中。然后继续打印所有行 第一行,直到包含EndingSearchD中找到的模式的行 找到变量
return将立即中断函数,其余代码将不会执行,因此它在第一个for循环中没有位置。第二个循环根本无法工作,因为您已经用完了文件,您只能在文件对象中迭代一次,除非您重置回第一行,或者将文件内容传输到其他容器(例如列表)并进行迭代。也就是说,我不确定我能否给出一个明确的答案来给出您期望的输出,因为我不清楚。请取消注释两个附录。用return mylist替换第二个break。您的函数不返回任何内容,只打印。所以,首先想想这是否正确,它是否应该回报或产生任何东西,以及应该是什么。请立即升级到Python 3,开始学习旧的Python 2部分是浪费时间。@UlrichEckhardt它确实返回了一些东西。我想OP是在问为什么被注释掉的部分不工作,而不是因为它们被注释掉了:你试过使用收益率吗?你在标题中提到了它。如果你用生产线代替印刷线,你认为会发生什么?为什么不试试看你是否正确?如果这是你想要的,很好;如果离得很近,而你又不知道如何把它弄对,你可以寻求帮助;如果这根本不对,你也不知道为什么,你可以问一下。
def SeeIfExactRangeIsFound():
with open(logfile) as input_file:
input_data = input_file.readlines()
mylist = []
allow_yielding = False
for line in input_data:
if BeginSearchDVar in line:
allow_yielding = True
if allow_yielding:
yield line
if line.strip() == EndinSearchD:
break
LRange = SeeIfExactRangeIsFound()
print LRange