Wpis z mikrobloga

@matthewonthego

1. Definiujesz funkcję foo przyjmującą jedno wejście, value.

2. Wewnątrz tej funkcji, mamy nieskończoną pętlę while True.

3. W pętli jest instrukcja value = (yield value). yield jest specjalnym słowem kluczowym w Pythonie, które jest używane do generowania wartości z funkcji. Funkcje, które używają yield, są nazywane generatorami. yield zwraca wartość value i jednocześnie wstrzymuje wykonywanie funkcji do momentu, gdy generator zostanie ponownie wywołany.

4. Tworzysz generator
Dokładnie tak! send i next są podobne w tym sensie, że obie funkcje wznawiają wykonywanie generatora od miejsca, w którym został ostatnio wstrzymany (zwykle przy użyciu yield), aż do następnego yield lub do końca funkcji generatora.

Różnica polega na tym, że:

- next(generator) wznawia generator i przekazuje wartość None do aktualnego yield.
- generator.send(value) wznawia generator i przekazuje wartość value do aktualnego yield.

Jeśli więc mamy generator, który wykorzystuje
@matthewonthego:

bar = foo(1) # tworzy bar jako obiekt generatora foo z wartością wewnętrzna value = 1

print(next(bar)) # wykonywane jest bar.__next__()
                         # generator bar wykonuje kod foo do napotkania yield
                         # yield przekazuje zwracaną wartość czyli 1
                         # generator zapamiętuje to miejsce

print(next(bar)) # wykonywane jest bar.__next__()
                         # generator kontynuje od zapamiętanego miejsca
                         # gdzie yield zwraca wartość None (brak send)
# kod wykonuje się do napotkania kolejnego yield
                         #