Python 为什么我的嵌套函数会出现 NoneType 错误?

0 投票
2 回答
978 浏览
提问于 2025-04-28 16:58

我刚开始学习编程。

 def start():
      x = 4
      def addition():
          n = 3
          def exponential():
              z = 2
              def multiplication():
                  l = 2
                  print(x + n ** z * l)
              return multiplication

  equals = start()
  equals()

为什么我会遇到“Nonetype”对象不可调用的错误呢?

暂无标签

2 个回答

0

首先要感谢@BrenBarn,因为他是第一个回答这个问题的人。不过我想把代码贴出来,让大家更清楚,并指出一些改进的方法。

def start():
  x = 4
  def addition():
    n = 3
    def exponential():
      z = 2
      def multiplication():
        l = 2
        print (x + n ** z * l)

      return multiplication()
    return exponential()
  return addition()

equals = start()
print equals #Output: 22

不过,这并不是列出不同方法的最佳方式。你应该学习如何在你的Python代码中使用类。

我将定义一个叫做“mathOperations”的类。我会定义三个方法(函数):加法、指数和乘法。这些函数是可以重复使用的。

class mathOperations():
  def addition(self,x,y):
    return x+y
  def exponential(self,x,y):
    return x**y
  def multiplication(self,x,y):
    return x*y

m= mathOperations()
z=2
l=2
x=4
n=3

result= m.addition(x,m.multiplication(m.exponential(n,z),l))
print result #Output:22

你应该学习如何让你的代码可以重复使用,试着去搜索一下“过程式编程”或者“面向对象编程”,或者看看《Learn Python the hard way》这本书。这些都是让你的代码可重用的最基本和最常用的方法。可以把它想象成一个通用的数学函数,用来解决问题。

3

你把很多编程概念搞混了:

  • 当你只需要一个语句的时候,不要去声明一个函数。
  • 你把函数的声明和调用搞混了,而且嵌套函数没有意义。在函数fn1里面声明的嵌套函数fn2,并不会自动调用fn2,也不会把fn2的返回值传回fn1。你还是得在每个函数里明确地使用返回语句。如果你忘了这一点,默认返回的是None,这通常不是你想要的结果。
  • 现在,先别嵌套函数。
  • 没有参数的函数基本上是没用的,它们不能接收输入并计算结果。想想看它们应该接收什么参数。

具体来说,你发的代码里,addition()和multiplication()根本没有返回值,也就是返回None。exponential()返回的是multiplication,也就是一个只返回None的函数。但无论如何,addition()和start()都忽略了这个返回值,因为它们也没有返回语句,所以它们隐式地返回None。调用start()只会得到None,所以你只是把equals = None赋值了,而不是你想要的某个数学表达式的结果。

所以:

  • 把每个不必要的函数简化成一个语句。
  • 把每个函数单独声明(不要嵌套)。
  • 每个函数必须有参数(在这种情况下至少要有两个参数,才有意义)。
  • 每个函数必须有一个返回语句,返回某个值。
  • 仅仅声明一个函数而不调用它,意味着这个函数根本不会被执行。
  • 在函数声明之间留一个空行(这样就能明显看出你是否忘记了返回语句)。

撰写回答