Как этот выход работает в этом генераторе? - PullRequest
1 голос
/ 10 февраля 2020
def read_large_file(file_handler, block_size=10000):
    block = []
    for line in file_handler:
        block.append(line)
        if len(block) == block_size:
            yield block
            block = []

    # don't forget to yield the last block
    if block:
        yield block

with open(path) as file_handler:
    for block in read_large_file(file_handler):
        print(block)

Я читаю этот фрагмент кода выше, написанный другим. Для этой строки:

if len(block) == block_size:
   yield block
   block = []

Есть ли шанс у block=[] быть выполненным? Я думал, что yield похоже на return заявление. Кроме того, почему if block проверка?

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

yield создает следующий выход генератора и затем позволяет ему продолжать генерировать значения.

Здесь строки считываются в блок (список строк). Всякий раз, когда блок заполняется достаточным количеством строк, он выдается как следующее значение из генератора, а затем блок повторно инициализируется в пустой список, и чтение может продолжаться.

1 голос
/ 10 февраля 2020

да, он будет выполнен, когда функция возобновит работу на следующей итерации. Помните, yield подобен кнопке паузы для генератора, и генераторы обычно используются в al oop. Выход своего рода , возвращающий значение (я говорю "своего рода", потому что yield - это не то же самое, что return), но при следующем обращении к генератору он будет срабатывать при этом то же место Цель block = [] состоит в том, чтобы сбросить блок в пустой список до следующего go (возможно, вместо этого будет быстрее использовать block.clear()).

Этот код создает блоки из файла и передать их обратно вызывающей стороне, как только они станут достаточно большими. Последний блок if должен вернуть последний бит, если есть какой-то остаток, который не помещается в полный блок.

...