在这个 PyCon 演讲中,Jack Diederich 展示了康威生命游戏的这个“简单”实现。我对 GoL 或半高级 Python 都不是很熟悉,但代码似乎很容易掌握,如果不是因为两件事:
- 的使用
yield
。之前看到过使用yield创建生成器,但是连续8个是新的……是返回一个8个生成器的列表,还是这个东西是怎么工作的? set(itertools.chain(*map(neighbors, board)))
. 明星解开了将邻居应用到董事会的结果列表(?),并且......我的想法刚刚爆发。
有人可以尝试为习惯于使用 map、filter 和 reduce 将一些 python 代码组合在一起但不是每天都使用 Python 的程序员解释这两个部分吗?:-)
import itertools
def neighbors(point):
x, y = point
yield x + 1, y
yield x - 1, y
yield x, y + 1
yield x, y - 1
yield x + 1, y + 1
yield x + 1, y - 1
yield x - 1, y + 1
yield x - 1, y - 1
def advance(board):
newstate = set()
recalc = board | set(itertools.chain(*map(neighbors, board)))
for point in recalc:
count = sum((neigh in board) for neigh in neighbors(point))
if count == 3 or (count == 2 and point in board):
newstate.add(point)
return newstate
glider = set([(0,0), (1,0), (2, 0), (0,1), (1,2)])
for i in range(1000):
glider = advance(glider)
print glider