﻿def fibonacci():
    """
    Generator ciągu Fibonacciego produkujący nieskończoną sekwencję liczb.
    Wykorzystuje słowo kluczowe yield do "leniwego" wyliczania kolejnych wyrazów.
    """
    a, b = 0, 1
    while True:
        # yield "zamraża" stan funkcji i wysyła aktualną wartość 'a' na zewnątrz
        yield a
        # Przejście do kolejnych wyrazów korzystając z przypisania wielokrotnego.
        # Jest to bezpieczne i optymalne, wartości obliczają się na podstawie starego stanu a i b.
        a, b = b, a + b

if __name__ == "__main__":
    print("Pobieranie kolejnych wartości funkcją next():")
    gen = fibonacci()
    print(next(gen)) # 0
    print(next(gen)) # 1
    print(next(gen)) # 1
    print(next(gen)) # 2
    print(next(gen)) # 3
    
    print("\nPobieranie pierwszych 10 liczb w pętli for (z warunkiem przerwania):")
    # Ponieważ generator jest nieskończony, musimy jawnie przerwać pętlę, np. licznikiem
    for i, val in enumerate(fibonacci()):
        if i == 10:
            break
        print(f"Fib[{i}] = {val}")
