【发布时间】:2019-01-17 11:35:25
【问题描述】:
抱歉标题含糊不清,但我真的不知道这里发生了什么。
from functools import reduce
arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
def strxo(n):
if (n == -1):
return "X"
elif (n == 1):
return "O"
else:
return "_"
def prboard(board):
print(reduce(lambda x, y: x + "\n" + y, list(map(lambda l: reduce(lambda a, b: strxo(a) + strxo(b), l), board))))
prboard(arr)
期望的输出:
___
___
___
实际输出:
__
__
__
当我将 strxo 上的最终 else 更改为 return str(n) 而不是 return "_" 时,我得到:
000
000
000
这是我所期望的和我想要的形状,但我想替换那些零。这是什么原因造成的?
【问题讨论】:
-
我不明白您如何期望从调用函数 3 次中得到 5 个下划线。或者为什么想要的输出首先是 5x3,而同时 3x3 的 0 网格是想要的形状。
-
调试步骤 1:重写您的代码,使其可读。理想情况下,使用
reduce摆脱那种功能风格,而改用列表推导。但至少,将这个怪物分成多行。 -
另外,你为什么要首先使用
map和reduce?您的外部reduce效率较低且难以理解'\n'.join,您的list(map(lambda…))效率较低且难以理解列表理解,而您的内部reduce...我不确定它应该是什么正在做;你为什么在这里调用strxo的累计值?为什么这一切都必须是一条怪异的线,而不是把它分解成你可以理解和调试自己的小块? -
@abarnert 我这样做是因为它是我习惯在 JavaScript 中使用的,很长一段时间后我又回到了 python,所以我只是想解决一个简单的问题-tac-toe 不用看太多。这篇文章上的每个人都非常有帮助!
标签: python arrays python-3.x functional-programming off-by-one