15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

it.send(EMPTY) # Manda o estado de q8, obtém a contagem

except StopIteration as e:

print('Count: ', e.value) # Valor obtido pelo comando return

>>>

First yield: Query(y=11, x=5)

Second yield: Query(y=11, x=6)

...

Count: 2

O próximo passo é implementar alguma indicação de que uma célula mudará de

estado em resposta à contagem de vizinhos obtida de count_neighbors. Para isso,

definimos outra corrotina chamada step_cell. Esse gerador indicará a transição

do estado de uma célula produzindo objetos Transition, outra classe definida por

nós mesmos, como fizemos com Query.

Transition = namedtuple('Transition', ('y', 'x', 'state'))

A corrotina step_cell recebe suas coordenadas na grade como argumentos. Ela

produz uma Query para obter o estado inicial dessas coordenadas. Depois, roda

count_neighbors para inspecionar as células ao seu redor e executa a lógica do

jogo para determinar que estado a célula deve adotar no próximo pulso de

relógio. Por fim, produz um objeto Transition para anunciar ao ambiente o

próximo estado da célula.

def game_logic(state, neighbors):

# ...

def step_cell(y, x):

state = yield Query(y, x)

neighbors = yield from count_neighbors(y, x)

next_state = game_logic(state, neighbors)

yield Transition(y, x, next_state)

Observe: a chamada a count_neighbors usa a expressão yield from. Essa

expressão permite que o Python monte uma composição de várias corrotinas

geradoras, facilitando a reutilização de trechos pequenos de funcionalidade para

construir corrotinas complexas a partir das mais simples. Quando

count_neighbors for exaurido, o valor final que ele devolve (no comando return)

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!