【问题标题】:Python: Print results of a parsing function in the function itself, or have the function return the result and print it an external calling function?Python:在函数本身中打印解析函数的结果,还是让函数返回结果并将其打印为外部调用函数?
【发布时间】:2018-10-18 22:24:44
【问题描述】:

我的问题可能是一个基本问题,但我还没有找到任何答案。我的目标是编写一个程序来解析文本文件中的新条目,并在该行超过 5 个字符时输出它们。考虑以下按预期工作的代码:

from pygtail import Pygtail

def parse(input):
    for line in input:
        if len(line) > 5:
            print(line)


def main():
    tail = Pygtail('D:\\test.txt')
    while True:
        parse(tail)       

main()

但是,如果我希望 parse 函数返回一个值并让 main 函数打印返回的内容,我会在输出中一遍又一遍地得到 None。错误代码:

from pygtail import Pygtail

def parse(input):
    for line in input:
        if len(line) > 5:
            return line


def main():
    tail = Pygtail('D:\\test.txt')
    while True:
        x = parse(tail)
        print(x)


main()

我知道None 是默认返回值,但我没有得到的是,当我尝试在文件中保存更长的行时,它似乎并不重要,并且会一直打印出@ 987654325@。它会以某种方式弄乱文件的偏移量吗?在我看来,这两个版本的代码应该表现相同,但他们没有。谁能解释这是为什么?

【问题讨论】:

  • 粘贴代码时出错。 return 语句在我的实际代码中正确缩进。
  • 当你得到解决方案时,请记得给有用的东西投票并接受你最喜欢的答案(即使你必须自己写),这样 Stack Overflow 才能正确存档问题。跨度>

标签: python loops parsing return


【解决方案1】:

当您在 parse() 函数中打印时,您会重复打印长度 > 5 的所有行。当您从函数中 return 时,您会在 first 迭代中结束其执行len(line) > 5,这就是导致您丢失结果的原因。

【讨论】:

  • 那么,您如何建议在解析函数中使用 return 语句来实现这一点。我听说使用类似 return 而不是 print 的函数是更好的做法。
  • @lhome1212 - 你写它的方式你不能把return换成print。如果要返回所有超过五个字符的行,可以将它们附加到 for 循环之外的列表中,然后在循环完成后返回列表。否则,您需要重新考虑您要完成的工作。
【解决方案2】:

这是generator 的经典用法。这是一个类似函数的项,每次调用都会返回一个结果;在每个连续的呼叫中,它将从中断的地方继续。你迭代结果。

def parse(input):
    for line in input:
        if len(line) > 5:
            yield line

def main():
    tail = Pygtail('D:\\test.txt')
    for x in parse(tail):
        print(x)

您几乎肯定已经像这样使用过range

【讨论】:

  • 是的,这可以工作!我是 python 新手,所以我以前从未真正使用过生成器,但这是有道理的。
  • 太棒了!我知道这比你目前为止可能学到的东西有点超前,但它太合适了,我希望你能伸展一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多