使用嵌套for循环的好习惯吗?

时间:2017-12-11 18:49:38

标签: python python-2.7 tic-tac-toe

我正在开展一个井字游戏,一切顺利,但我想知道是否有更好的方法来执行以下代码:

def straight_check(play_board, item):
    inc_up = 1
    inc_down = 1
    for num in range(3):
        for second in range(3):
            if play_board[second][num] == 'x':
                if inc_up == 3:
                    return True
                inc_up += 1
            else:
                continue
            if play_board[num][second] == 'x':
                if inc_down == 3:
                    return True
                inc_down += 1
            else:
                continue

    return False

此功能接收游戏的板(3x3嵌套列表)以及用户char(x或o)。此功能检查用户char是否在电路板上连续出现3次(水平或垂直)。有没有其他方法可以做到这一点,而不使用嵌套的for循环和变量?此外,这种编程是否与编程良好实践的大小一致?

1 个答案:

答案 0 :(得分:1)

实际上,存在一些问题。您应该重置外部循环内的计数器(或者您将继续增加先前失败的chcks的计数)并删除else: continue部分,否则如果相应的item中没有def straight_check(play_board, item): for x in range(3): # reset the counters in inner loop cnt_hori, cnt_vert = 0, 0 for y in range(3): if play_board[x][y] == item: cnt_hori += 1 if cnt_hori == 3: return True if play_board[y][x] == item: cnt_vert += 1 if cnt_vert == 3: return True return False ,您将跳过列检查行:

zip(*...)

一般来说嵌套循环本身没有任何错误(因为你事先知道这只是一个3x3矩阵)。但请注意,内置函数anyall以及def straight_check(play_board, item): if any(all(x == item for x in row) for row in play_board): return True if any(all(x == item for x in col) for col in zip(*play_board)): return True return False 转置模式可用于实现某些效果,以缩短代码)让它更具可读性:

apt-get install php7.2-xml

你可以用自然语言来思考:它是否适用于“任何”行,其中“所有”项目都是'x'等?