Skip to main content
 首页 » 编程设计

python之如果 python 中的 block 未使用 True 语句执行

2025年05月04日15落叶无声

我刚开始用小脚本学习 python。我遇到了一个测验,如果第一行与第一列相同,则确定列表是对称的, 第二行与第二列相同,依此类推。

def symmetric(block): 
    n = len(block) 
    i = 0 
    for i in range(n-1): 
        j = 0 
        for j in range(n-1): 
            if (block[i][j] != block[j][i]): 
                return False 
            j +=1 
        i +=1 
    return True 

结果

print symmetric([["cat", "dog", "fish"], 
                ["dog", "dog", "dog"], 
                ["fish","fish","cat"]]) 

应该是假的。

但是,此代码始终返回 True,在调试器中我可以看到 block[i][j] != block[j][i] 返回 True 但 if block 未执行。比较有什么问题或 if block 的组成不正确吗?

请您参考如下方法:

失败的主要原因是因为你应该写range(n)而不是 range(n-1) (上限是独占的)。喜欢:

def symmetric(block): 
    n = len(block) 
    for i in range(<b>n</b>): 
        for j in range(<b>n</b>): 
            if block[i][j] != block[j][i]: 
                return False 
    return True

不过,这个函数有几个奇怪的地方:

  • 你初始化i = 0和 j = 0 .这不是必需的:在 Python 中,for循环将为您声明变量;
  • 您对 i 执行递增/递减和 j ,这又是没有必要的。 for循环枚举迭代器/生成器并将每个值分配给 i和 j ;
  • 通常不为if写括号声明。

此外,您实际上可以使用带有 all(..) 的两行代码使这段代码更优雅。内置函数:

def symmetric(block): 
    n = len(block) 
    return <b>all(block[i][j] == block[j][i] for i in range(n) for j in range(n))</b>

这是一种更声明式和更显式的代码编写风格。因为这里的代码几乎是不言自明的:“是否返回 block[i][j] == block[j][i] 中的 i 和 range(n) 中的 j 的所有 range(n) ”

终于赞@Błotosmętek在他们的评论中说,你不必检查 block[2][0] == block[0][2]如果你已经检查了 block[0][2] == block[2][0] .所以你可以通过写来提高性能(大约一半):

def symmetric(block): 
    n = len(block) 
    return all(block[i][j] == block[j][i] for i in range(n) for j in range(<b>i</b>))