【问题标题】:Is using nested for loops good practice?使用嵌套 for 循环是好习惯吗?
【发布时间】:2017-12-12 04:11:53
【问题描述】:

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

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 嵌套列表)以及用户字符(x 或 o)。此函数检查用户字符是否在板上连续出现 3 次(水平或垂直)。有没有另一种方法可以在不使用嵌套 for 循环和变量的情况下做到这一点?还有,这种编程方式和编程大小一起是好的做法吗?

【问题讨论】:

  • 来自 Python 之禅:“扁平胜于嵌套”。无论如何——这更像是Code Review 的问题,而不是这里。
  • 嵌套循环基本上没有什么“坏”,我认为您的代码没有任何问题。请注意您在这些循环中所做的事情(例如实例化大型对象),因为这可能会造成性能问题。
  • 对。不错,你应该永远不要做这件事,但不好的是,当有更有效的算法可以避免它时,这是你不应该做的事情 .
  • “吃蘑菇对你有好处吗?” - 如果它们有毒,则不会。嵌套循环也是如此 - 取决于您使用它们的目的。
  • @djk47463 “行”(或“列”)的数量只有 O(n^2),但项目总数为 O(N)。

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


【解决方案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

嵌套循环通常没有本质上的错误(因为您事先知道这只是一个 3x3 矩阵)。但是请注意,有内置函数 anyall 以及 zip(*...) 转置模式,您可以使用它们来缩短代码并(也许)使其更具可读性:

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

您可以从自然语言的角度来考虑这一点:它是否适用于其中“所有”项目都是“x”等的“任何”行?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-03
    • 2021-02-13
    • 2012-05-30
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    相关资源
    最近更新 更多