在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