Python stringTypeError:必须为str,而不是NoneType

时间:2018-09-05 14:53:42

标签: python

def SRM(stringToReverse):    如果len(stringToReverse)== 0或stringToReverse == None:        返回    返回stringToReverse [len(stringToReverse)-1] + SRM(stringToReverse [:len(stringToReverse)-1]    #print(temp,end ='')<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:template match="file"> <xsl:apply-templates select="line[1]/entry" mode="group"/> </xsl:template> <xsl:template match="entry" mode="group"> <xsl:variable name="index"> <xsl:number format="A" value="position()"/> </xsl:variable> <xsl:variable name="pos" select="position()"/> <xsl:element name="group{$index}"> <xsl:apply-templates select="../../line/entry[position() = $pos]"/> </xsl:element> </xsl:template> <xsl:template match="entry"> <observation value="{.}"/> </xsl:template> </xsl:stylesheet> SRM(“我的名字叫汗”)

4 个答案:

答案 0 :(得分:1)

我猜这是一个家庭作业问题,并且我了解您正在寻找“如何使用递归来反转字符串”。

首先,正如许多人提到的那样,请取出所有“ str”并用“ myStr”或其他内容替换。您不想掩盖任何内置的东西。

第二,递归逻辑存在问题。

问题1:基本情况。您希望函数遍历字符串并以空字符串结尾时返回什么?为什么返回不返回任何内容?请将第3行更正为return ""

问题2:您的函数返回NoneType。那是因为递归的情况是有问题的。您的print试图将str[len(str) - 1]的字符串与rev(str[:len(str) - 1])的结果连接起来,但是后一部分不是return的字符串,什么都不是!为什么打印但不返回?将您的print替换为return,以便递归调用实际上为您生成一个字符串,您以后可以将其与第一个切片的字符串合并。

因此,代码应类似于以下内容,但是再次,请充分理解递归逻辑。否则,您将陷入下一个递归问题。

def rev(x):
    if len(x) == 0:
        return ""
    return x[len(x) - 1] + rev(x[:len(x) - 1])

print(rev("ABC DEF"))
# Correctly prints: FED CBA.

答案 1 :(得分:0)

如果不将字符串传递给函数,则str变量为None。 像这样调用您的函数

rev()

可能会产生您的错误。 将第2行更改为:

if str is None or len(str) == 0:

答案 2 :(得分:0)

我会改变

if len(str) == 0: 

if not rev_string: 

这将处理None和一个空字符串。

编辑:如jwodder所评论;为str使用另一个名称(rev_string或类似名称)

答案 3 :(得分:0)

您还可以使用扩展切片的功能:

def reverser(s=None):
    if not s:
        return ''
    return s[::-1]