在Python函数中使用yield,print和return

时间:2018-06-23 07:13:50

标签: 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()
                #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函数的输出存储在一个变量中,并稍后使用该变量的内容。

我的问题是,尽管我尝试过尝试(以下面的方式注释)尝试不同的方法来实现我的目标,但似乎没有一个奏效。我觉得我已经很接近答案了,但是我花了2个小时才弄清楚这个问题。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

符合您的描述而不是您的代码的版本

  

找到特定模式后,我开始打印日志文件的内容   在正在读取的行中。然后继续打印所有行   第一行,直到包含EndingSearchD中找到的模式的行   找到变量。

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

答案 1 :(得分:0)

您几乎明白了,但是您的return语句不在适当的范围内:

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()]