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.

count_neighbors, que funciona produzindo (com yield ) objetos Query. A classe

Query é definida em nosso próprio código. Seu propósito é fazer com que a

corrotina geradora possa perguntar às células vizinhas sobre seu estado.

Query = namedtuple('Query', ('y', 'x'))

A corrotina produz um Query para cada vizinho. O resultado de cada expressão

yield poderá ter valores ALIVE ou EMPTY. Esse é o contrato de interface que

definimos entre a corrotina e o código consumidor. O gerador count_neighbors

vê os estados dos vizinhos e retorna a contagem dos vizinhos vivos.

def count_neighbors(y, x):

n_ = yield Query(y + 1, x + 0) # Norte

ne = yield Query(y + 1, x + 1) # Nordeste

# Aqui vai o código que define e_, se, s_, sw, w_, nw ...

# ...

neighbor_states = [n_, ne, e_, se, s_, sw, w_, nw]

count = 0

for state in neighbor_states:

if state == ALIVE:

count += 1

return count

Podemos alimentar a corrotina count_neighbors com dados falsos para testá-la.

No exemplo de código a seguir, percebemos como os objetos Query são

produzidos para cada vizinho. count_neighbors recebe os estados da célula

correspondente a cada Query por meio do método send da corrotina. A contagem

final é devolvida na exceção StopIteration que é levantada quando o gerador é

exaurido pelo comando return.

it = count_neighbors(10, 5)

q1 = next(it) # Obtém a primeira Query

print('First yield: ', q1)

q2 = it.send(ALIVE) # Manda o estado de q1, obtém q2

print('Second yield:', q2)

q3 = it.send(ALIVE) # Manda o estado de q2, obtém q3

# ...

try:

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!