我正在编写一个Connect 4游戏,并且有一个类似于玩游戏的二维网格的Grid类。我的Grid类的底层数据结构是一个实例变量self.grid
- a 2 - 维度列表。
我已经覆盖了__iter__
方法:
def __iter__(self):
for row in range(self.numRows):
for col in range(self.numCols):
yield self.grid[row][col]
我可以称之为:
for cell in grid:
# do something with yielded cell
在某些时候,我需要迭代指定的行或指定的列。而不是写
col = 0
for row in range(grid.numRows):
# do something with grid.grid[row][col]
是否有任何Pythonic,可读方式来定义第二个和第三个__iter__
方法:
def __iter__(self, col)
for row in range(self.numRows):
yeild self.grid[row][col]
将被称为:
for row in grid(col=0):
# do something with the yielded cell
然后相同,但指定的row
?
答案 0 :(得分:1)
你当然可以拥有尽可能多的这些方法。您无法全部调用它们__iter__()
,因为Python不支持方法重载。例如,你可以这样做:
def rows(self, col):
for row in range(self.numRows):
yield self.grid[row][col]
def cols(self, row):
for col in range(self.numCols):
yield self.grid[row][col]
def cells(self):
for row in range(self.numRows):
for col in range(self.numCols):
yield self.grid[row][col]
然后你会写一些像
这样的东西for row in grid.rows(col=0):
# Do something
答案 1 :(得分:0)
当然可以这样做,无需添加特殊方法。只需添加迭代器,下面的python 3代码:
ALL = 0
ROW = 1
COL = 2
class db:
def __init__(self, n):
self.n = n
def __iter__(self):
return db_iter_all(self.n)
def __call__(self, what = ALL):
if what == ALL:
return db_iter_all(self.n)
if what == ROW:
return db_iter_row(self.n)
if what == COL:
return db_iter_col(self.n)
raise ValueError("What what?")
class db_iter_all:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i > self.n:
raise StopIteration()
r = self.i
self.i += 1
return r
class db_iter_row:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i > self.n:
raise StopIteration()
r = self.i
self.i += 3
return r
class db_iter_col:
def __init__(self, n):
self.i = 0
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.i > self.n:
raise StopIteration()
r = self.i
self.i += 5
return r
简单的例子如何使用它
grid = db(15)
for k in grid:
print(k)
for k in grid(ROW):
print(k)
for k in grid(COL):
print(k)