【问题标题】:Python: My function returns "None" after it does what I want it to [duplicate]Python:我的函数在执行我想要的操作后返回“None”[重复]
【发布时间】:2013-10-01 00:13:53
【问题描述】:

这是我的程序

def reverse(letters):
    backwards = ""
    i = len(letters) - 1
    while i >= 0:
        backwards = backwards + letters[i]
        i = i - 1
    print (backwards)

print (reverse("hello"))

它有效,它打印出“olleh”,但之后,它在新行上打印“None”。我在问为什么会这样。 很明显程序是反一个单词,代码可以工作,没有函数就不会打印none,所以不知道为什么在函数中会这样。这正在另一个更大的程序中使用,所以我需要它作为一个函数,并且因为它是用于学校的,所以我不能简单地使用 .reverse() 函数。因此,如果可能的话,我真的需要修复此代码而不是进行大的更改。

【问题讨论】:

    标签: python


    【解决方案1】:

    函数默认返回None,所以你应该明确return backwards

    另外,你可以使用pythonic的方式来解决这个问题:

    letters[::-1]
    

    【讨论】:

    • 赞成pythonic方式来解决问题。
    【解决方案2】:

    您可以使用 return 语句来退出返回值的函数。如果函数没有到达return语句就结束了,默认返回None

    def add1(x):
       return x+1
    
    def returnsNone():
       pass
    
    print(add1(2))
    print(returnsNone())
    

    【讨论】:

    • 这是什么语言?这些定义都不是有效的 Python 语法。
    • @Max:来吧,第一个只是少了一个冒号:)
    • @missingno:不仅如此。 end 在 Python 中没有任何特殊意义。
    • @DSM:妈的。我想我最近在 Lua 上花了太多时间。
    • [由于 defs 已修复,删除了反对票]
    【解决方案3】:

    每个函数在 Python 中都会返回 something。如果你没有显式返回值,Python 会让你的函数返回 None

    您的函数实际上并没有返回任何内容,因为print 打印到标准输出,而return 实际上返回一个值。它们在 REPL 中可能看起来相同,但它们完全不同。

    所以要解决你的问题,返回一个值:

    return backwards
    

    【讨论】:

      【解决方案4】:

      试试吧:

       reverse(hello) 
      

      其实用

      print reverse(hello) 
      

      您正在打印 reverse 的返回值。并且该返回值为无。

      让我给你一些一般性的建议:

      reverse() 在您的代码中是一个具有副作用(打印)的函数。你应该避免 不需要时有副作用的函数,考虑让 reverse() 返回单词而不是打印它:

      def reverse(letters):
          backwards = ""
          i = len(letters) - 1
          while i >= 0:
              backwards = backwards + letters[i]
              i = i - 1
          return backwards
      print (reverse("hello"))
      

      还有

      i = len(letters) - 1
          while i >= 0:
              backwards = backwards + letters[i]
              i = i - 1
      

      不容易维护,如果你在循环中添加功能,减量 i=i-1 将远离它应该“概念上”的位置。您应该更喜欢与支票一起减少:

      for i in xrange(len(letters)-1,-1,-1): 
          backwards = backwards + letters[i] 
      

      当我懒惰时,我会写

      myString = myString + fewChars
      

      所以我能理解你的懒惰。但是添加几个字符并不会修改 myString 而是创建一个新的。如果您要迭代地添加许多字符,最有效的方法很少是逐个添加。考虑使用 join()。 比如

      letters = 'word'
      lettersList = [letters[i] for i in xrange(len(letters)-1,-1,-1)]
      myReversed ''.join(lettersList)
      

      好的,我同意它不可读,可能甚至更快,但对于较大的字符串,它比 newString = oldString + oneChar 方法更好地扩展。

      也就是说,更多的pythonic方法

      letters[::-1] 
      

      已经由比我快的人提出的建议通常效果更好,并且易于被 python 程序员阅读。

      【讨论】:

        【解决方案5】:

        如果您考虑一下,这是有道理的。你的 reverse 不返回任何东西 - 它只是打印它的结果。但是当您编写print (reverse("hello")) 时,您实际上是在打印reverse 返回的内容。由于它不返回任何内容,因此会打印None

        【讨论】:

          【解决方案6】:

          如前所述。如果 python 函数没有遇到return 语句,它默认打印None。进行如下所示的小改动可以解决此问题:

          def reverse(letters):
              backwards = ""
              i = len(letters) - 1
              while i >= 0:
                  backwards = backwards + letters[i]
              i = i - 1
              return(backwards)  # instead of print(backwards)
          
          print(reverse("hello"))
          

          【讨论】:

          • s/prints/returns/
          猜你喜欢
          • 2017-12-10
          • 2023-01-12
          • 1970-01-01
          • 2022-12-25
          • 2022-11-21
          • 2013-12-23
          • 2021-12-08
          • 2023-01-22
          • 2023-02-23
          相关资源
          最近更新 更多