【问题标题】:Weird function return value?奇怪的函数返回值?
【发布时间】:2012-06-21 07:21:40
【问题描述】:

我正在尝试删除字符串中大括号之间的所有内容,并尝试以递归方式执行此操作。 当递归结束时,我在这里返回x,但不知何故,函数doit在这里返回None。尽管在 def 中打印 x 会打印正确的字符串。 我做错了什么?

strs = "i am a string but i've some {text in brackets} braces, and here are some more {i am the second one} braces"
def doit(x,ind=0):
   if x.find('{',ind)!=-1 and x.find('}',ind)!=-1:
     start=x.find('{',ind)
     end=x.find('}',ind)
     y=x[start:end+1]
     x=x[:start]+x[end+1:]
     #print(x)
     doit(x,end+1)
   else:
       return x

print(doit(strs))

输出:
None

【问题讨论】:

  • 我注意到这是一种非常糟糕的做法,但我认为这是一个编程练习,因为“我正在尝试以递归方式进行”声明。
  • @Lattyware 是的!我试图通过这个来解决一个 SO 问题。

标签: python python-3.x return-value


【解决方案1】:

如果if 块成功,您将永远不会返回任何内容。 return 语句位于 else 块中,只有在其他所有内容都不是时才会执行。您想返回从递归中获得的值。

if x.find('{', ind) != -1 and x.find('}', ind) != -1:
    ...
    return doit(x, end+1)
else:
    return x

【讨论】:

  • 添加,当函数结束时没有显式return或显式return没有给出参数,那么它就像你使用return None一样。
【解决方案2】:
...
#print(x)
doit(x,end+1)
...

应该是

...
#print(x)
return doit(x,end+1)
...

您在 if 块中缺少 return 语句。如果函数以递归方式调用自身,则不会返回该调用的返回值。

【讨论】:

    【解决方案3】:

    注意使用正则表达式更容易:

    import re
    strs = "i am a string but i've some {text in brackets} braces, and here are some more {i am the second one} braces"
    strs = re.sub(r'{.*?}', '', strs)
    

    【讨论】:

    • 我知道它可以在一行中完成,我只是在尝试与使用regex 有所不同(递归)的方法。
    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多