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

时间:2014-10-21 02:35:34

标签: python callable nonetype

我是编程新手。

 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 :(得分:3)

你混淆了一堆编程概念:

  • 只要您需要声明
  • ,不要声明函数
  • 您将函数声明与函数调用(调用)混淆,并且嵌套也毫无意义。在fn1中声明嵌套的fn2并不会神奇地调用fn2并将其返回值发送回fn1。你仍然必须使用每个fn的显式return语句。(如果你忘记了,你隐式返回None,这几乎肯定不是你想要的)
  • 目前,根本就没有嵌套功能。
  • 没有参数的函数基本上没用,它们不能接受输入并计算结果。弄清楚他们的论点应该是什么。

特别是对于您发布的代码,addition(),multiplication()根本没有任何返回值,即None。 exponential()返回乘法,即只返回None的函数。但是,无论如何,addition()和start()都忽略了,因为它们也没有return语句,因此它们隐式返回None。 调用start()只会给你None,所以你只需要分配equals = None。不是像你想要的那样数学表达的结果。

所以:

  • 将所有不必要的功能简化为声明
  • 分别声明每个函数(非嵌套)
  • 每个fn必须有args(在这种情况下,至少有两个args,以便有意义)
  • 每个fn必须有一个返回一些值的return语句
  • 只声明一个函数而从不调用它意味着它永远不会被运行。
  • 在函数声明之间放一个空行(如果你忘记了return语句就很明显了)

答案 1 :(得分: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

你应该学习如何使你的代码可重用,尝试google“程序编程”; “面向对象编程”,或者查看“学习Python困难之路”一书。这些是第一个也是最常用的方法,可以使您的代码重用。可以把它想象成解决问题的通用数学函数。