定义一个类中iter的多个方差

2024-04-18 22:19:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个连接4的游戏,有一个网格类,类似于游戏所使用的二维网格。我的网格类的底层数据结构是一个实例变量self.grid——一个二维列表。你知道吗

我重写了__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]

有没有什么通俗易懂的方法来定义第二个和第三个__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?你知道吗


Tags: 方法inself网格forwithcellrange
2条回答

当然可以,不需要添加特殊方法。只需添加迭代器,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)

你当然可以有很多这样的方法。您不能全部调用它们__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

相关问题 更多 >