Python: печатать результаты функции синтаксического анализа в самой функции или же функция должна возвращать результат и выводить ее из внешней вызывающей функции? - PullRequest
0 голосов
/ 09 мая 2018

Мой вопрос может быть основным, но я не нашел ответов. Моя цель - написать программу, которая анализирует новые записи в текстовом файле и выводит их всякий раз, когда в строке больше 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()

Однако, если я хочу, чтобы функция синтаксического анализа возвращала значение, а основная функция выводила возвращаемое значение, я получаю 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 - это возвращаемое значение по умолчанию, но я не получаю, что, когда я пытаюсь сохранить более длинную строку в файле, это не имеет значения и всегда будет печатать None. Может ли это как-то испортить смещение файла? Мне кажется, что обе версии кода должны вести себя одинаково, но это не так. Может ли кто-нибудь пролить свет на то, почему это так?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это классическое использование для 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 вот так.

0 голосов
/ 09 мая 2018

Когда вы печатаете в вашей функции parse(), вы печатаете повторно для всех строк длиной> 5. Когда вы return из своей функции, вы заканчиваете ее выполнение на первой итерации, которая имеет len(line) > 5, из-за чего вы теряете результаты.

...