所以我用 python 创建了 Tic Tac Toe 的简单小项目
(同版文字形式):
a b c
0 - | - | -
-----------
1 - | - | -
-----------
2 - | - | -
当我尝试仅使用循环来执行此操作时,我会得到诸如“|”之类的工件在行末尾和第 2 行下方的“---------”,而它只应该位于第 0 行和第 1 行下方。我可以使用 if 语句来规避此问题,但我想知道是否有更好的方法.
我原本有
def print_board():
print(" a b c")
print("")
print("0 " + coords[columns[0]][rows[0]] + " | " + coords[columns[1]][rows[0]] + " | " + coords[columns[2]][rows[0]])
print(" -------------")
print("1 " + coords[columns[0]][rows[1]] + " | " + coords[columns[1]][rows[1]] + " | " + coords[columns[2]][rows[1]])
print(" -------------")
print("2 " + coords[columns[0]][rows[2]] + " | " + coords[columns[1]][rows[2]] + " | " + coords[columns[2]][rows[2]])
这是我能想到的最好的设计,而且它有效。
def print_board():
print(" a b c", end="\n\n")
for r in range(3):
print(str(r) + " ", end="")
for c in range(3):
print(coords[columns[c]][rows[r]], end="")
if c != 2:
print(" | ", end="")
print("\n")
if r != 2:
print(" -------------")
但是,我觉得这样可能会更好。 具体来说,我想摆脱 if 语句但得到相同的结果。 所以我想知道是否可以在最后一次迭代中跳过循环的一部分?
您可以使用嵌套列表推导式在一行中完成此操作,并使用列和行分隔符将它们连接起来。
values = [
["X", "X", "X"],
["X", "X", "X"],
["X", "X", "X"]
]
def print_board():
print("\n ----------\n".join([str(row) + " " + " | ".join([val for val in values[row]]) for row in range(3)]))
print_board()
但这可能有点太晦涩了,所以你可以混合一下。
循环的第一个和最后一个情况有时必须被视为特殊情况。
在此示例中,我将第一行作为特殊情况打印,然后在循环中我首先打印分隔符,然后打印值
对于列,我使用不同的方法:将字符串构造为理解列表,然后使用
|
作为连接元素将其转换为字符串。
这当然是一种方法,但在问题中将第一个或最后一个元素单独视为特殊情况并不罕见。
values = [
["X", "X", "X"],
["X", "X", "X"],
["X", "X", "X"]
]
def print_board():
# print the first row as a separate case
print("0 " + " | ".join([val for val in values[0]]))
for row in range(1, 3):
print(" -------------")
print(f"{row} {' | '.join([val for val in values[row]])}")
print_board()
0 X | X | X
-------------
1 X | X | X
-------------
2 X | X | X
如果你愿意的话