很抱歉标题含糊不清,但我真的不知道这里发生了什么。你知道吗
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
这正是我所期望的和我想要的形状,但我想替换那些零。是什么原因造成的?你知道吗
问题是,最内部的reduce函数(作用于子列表的函数)总是将第二个参数转换为
_
:所以,在reduce的最后一个元素上,
b
是__
,它变成了_
!你知道吗您想先将映射到
strxo
上,然后使用串联减少。你知道吗所以你想要这样的东西:
注意,我删除了对
list
的不必要的调用。你知道吗但更重要的是,停止使用
reduce
和连接操作符来连接字符串!这是不必要的冗长,而且引导效率低下(它将具有二次时间复杂性)。你知道吗
相反,请使用:
这是一个非常好的函数。函数式编程并不意味着“尽可能地使用map和reduce”。你知道吗
下面是一些很好的函数式编程:
更好的是,您应该只使用列表理解,它们是显著的函数构造(顺便说一句,Python从Haskell那里偷走了它们)。它通常比
map
+lambda
更易读:相关问题 更多 >
编程相关推荐