8

这是我的程序

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() 函数。因此,如果可能的话,我真的需要修复此代码而不是进行大的更改。

4

6 回答 6

4

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

此外,您可以使用 pythonic 方法来解决问题:

letters[::-1]
于 2013-10-01T00:18:45.170 回答
3

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

def add1(x):
   return x+1

def returnsNone():
   pass

print(add1(2))
print(returnsNone())
于 2013-10-01T00:17:07.607 回答
1

试试:

 reverse(hello) 

事实上与

print reverse(hello) 

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

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

代码中的 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 程序员阅读。

于 2013-10-01T05:05:18.747 回答
1

每个函数都返回Python 中的某些内容。如果你没有明确地返回一个值,Python 有你的函数 return None

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

因此,要解决您的问题,请返回一个值:

return backwards
于 2013-10-01T00:22:25.800 回答
0

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

于 2013-10-01T00:19:39.467 回答
0

如前面提到的。如果 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"))
于 2017-12-12T19:02:16.480 回答