【问题标题】:Formating a sum reduce function in Python在 Python 中格式化 sum reduce 函数
【发布时间】:2021-08-25 02:58:18
【问题描述】:

我正在尝试使用 reduce 格式化 sum 函数的结果。所以输入 sum_equation([1,5,7]) 应该返回“1 + 5 + 7 = 13”。

这是我实现的:

from functools import reduce


def sum_equation(L):
    return reduce(lambda x, y: x+y, L, 0)


def main():
    result = sum_equation([1, 5, 7])
    print("{} + {} = {}".format(x, y, result))


if __name__ == "__main__":
    main()

它有一个错误:NameError: name 'x' is not defined。你能解释什么是不正确的,我该如何解决这个问题

【问题讨论】:

  • xy 只能在 lambda 函数内部访问。不在外面。
  • 因为x不在范围内。

标签: python sum format reduce


【解决方案1】:

对于您的问题,xy 都仅在 reduce 函数的范围内,因此它们无法在 main 范围内访问。

您可以找到另一种实现目标的简短表格供参考,如下所示:

from functools import reduce

print(reduce(lambda x,y: x+' + '+y, [str(i) for i in [1,5,7]]) + ' = ' + str(reduce(reduce(lambda x,y: x+y, [1,5,7]))))

【讨论】:

    【解决方案2】:

    您需要为变量添加全局关键字。这样做 -

    from functools import reduce
    
    
    def sum_equation(L):
        global x
        global y
        return reduce(lambda x, y: x+y, L, 0)
    
    
    def main():
        global x
        global y
        result = sum_equation([1, 5, 7])
        print("{} + {} = {}".format(x, y, result))
    
    
    if __name__ == "__main__":
        main()
    

    更多信息 - Python scope

    【讨论】:

      【解决方案3】:

      正如原评论者所说,xy 的值只能在 lambda 表达式的范围内访问。虽然在这种情况下,您可以通过迭代 L 来访问这些值。

      将您的 main() 函数编辑为以下内容:

      
      def main(L):
          result = sum_equation(L)
          print(L[0], end=" ")  # print first value without prefix '+'
          for value in L[1:]:
              print("+", value, end=" ")
      
          print("=", result)  
          # 1 + 5 + 7 = 13
      

      【讨论】:

        【解决方案4】:

        reduce() 存储中间结果,只返回最终的求和值。然而,accumulate() 返回一个包含中间结果的迭代器。返回的迭代器的最后一个数字是列表的总和值。 来源:https://www.geeksforgeeks.org/reduce-in-python/ 这意味着它不会返回 x&y 的值,因此您不能将它们单独与 print 一起使用

        【讨论】:

          【解决方案5】:

          请试试这个:

          from functools import reduce
          
          def sum_equation(L):
              return reduce(lambda x, y: x+y, L, 0)
          
          def main(L):
              result = sum_equation(L)
              print("{} + {} + {} = {}".format(L[0], L[1], L[2], result))
          
          if __name__ == "__main__":
              main([1,5,7])
          
          # 1 + 5 + 7 = 13
          

          问题在于 xymain 中无法访问。还有其他几种方法可以解决这个问题,但我发现这种方法最简单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-01-07
            • 1970-01-01
            • 2015-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多