генератор python возвращает «объект генератора», а не значение - PullRequest
0 голосов
/ 14 октября 2018

Я написал генератор, но он не выполнялся (строка № 5 не выполнялась в my_func, но сгенерировал объект генератора в строке № 17).
В режиме отладки даже отладчик не выполнялвыполнить первую точку отладки в строке 5.

enter image description here

Мне интересно, как мой код генерирует «объект-генератор», не входя в соответствующую функцию my_func.

Мой код:

import time
import os

def my_func(fileName,data):
    print("generator Started")  # line 5
    with open(fileName,'r') as f:
        for line in f:
            data = line.split(",")
            if data in (data[0]):
                yield line
def calling_func():
    start = time.time()
    dirName = "D:\\Datasets"
    filName = "data.txt"
    fileName = os.path.join(dirName,filName)
    keyword1 = 49
    data = my_func(fileName,keyword1)  # line 17
    print(x for x in data)
    print("time taken ----=>",(time.time() - start))

if __name__ == "__main__":
    calling_func()

1 Ответ

0 голосов
/ 14 октября 2018

Это точное назначение генератора.

С https://www.programiz.com/python-programming/generator:

Если функция содержит хотя бы один оператор yield (может содержать другие операторы yield или return), она становится функцией генератора,И yield, и return вернут некоторое значение из функции.

Поскольку my_func использует yield, функция является генератором.

Разница в том, что, хотя оператор return полностью завершает функцию, оператор yield приостанавливает функцию, сохраняя все ее состояния, и затем продолжает последующие вызовы.

Когда вы вызывали data = my_func(fileName,keyword1), вы создали генератор («объект генератора»).
Теперь, когда вы повторяете его в print(x for x in data), каждая итерация будет выполняться my_func до тех пор, пока my_func не будет эксгустирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...