Python привести к значению ключевого слова и путанице в отношении генераторов? - PullRequest
0 голосов
/ 24 марта 2020

Я запутался, почему мы не сказали yield b, и что будет с разницей, если я удалил yield a?

Я просто запутался в том, как они сравниваются с обычной функцией?

def fibonacci(n):
    """ A generator for creating the Fibonacci numbers """
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(5)
for x in f:
    print(x, " ", end="") # 
print()

1 Ответ

0 голосов
/ 24 марта 2020

Нормальная функция будет выглядеть почти так же:

def fibonacci(n):
    """ A <b>function</b> for creating the Fibonacci numbers """
    a, b, counter = 0, 1, 0
    <b>numbers = []</b>
    while True:
        if (counter > n): 
            <b>return numbers</b>
        <b>numbers.append(a)</b>
        a, b = b, a + b
        counter += 1

b используется только для отслеживания внутреннего состояния процесса. a - единственное значение, когда-либо напрямую отображаемое через итератор или возвращаемое значение, а b используется только для вычисления a.

Обычная функция вычисляет все запрошенное Числа Фибоначчи, затем сохраняют их в списке и возвращают этот список вызывающей стороне. Это может потребовать значительного времени и памяти, если n велико.

Функция генератора, с другой стороны, возвращает почти сразу, потому что она еще ничего не вычисляла. Он только возвратил экземпляр generator, который при передаче на next вычислит следующее число Фибоначчи в последовательности и вернет его, затем go вернется в ожидание, пока вы снова не вызовете next. Он всегда использует только небольшой постоянный объем памяти, и каждый вызов next занимает только столько времени, сколько необходимо для выполнения небольшого количества добавлений.

...