为什么这个 L 系统代码不返回字符串?



>我正在尝试编写一个程序,该程序接受一个字符串并用其他字符串替换某些字符。(A->AB)和(B->A)在这种情况下。当我运行它时,我希望返回最后一个字符串,但实际上什么都没有返回。

def createSystem(seed,depth):
startString = seed
endString = ""
for i in range(depth): 
endString = processString(startString)
startString = endString
return endString   

def processString(oldstr):
newstr=""
for char in oldstr:
newstr=newstr+applyrules(oldstr)
return(newstr)
def applyrules(oldstr):
output=""
for char in oldstr:
if char=="A":
output.join("AB")
elif char=="B":
output.join("A")
return(output)

print(createSystem("AB",1))

在此示例中,我希望种子"AB"生成字符串"ABA",但是没有任何东西返回到控制台。这是为什么呢?提前感谢!-伊

编辑:程序编译,不会产生任何错误。

例如,您似乎期望

output = ""
output.join("AB")

表示:"output是一个空字符串;现在导致output成为将'AB'添加到现有output末尾的结果"。

它没有。

它的意思是:"output是一个空字符串;现在通过将现有的output放在'AB'的每个字符之间来创建一个新字符串,然后扔掉这个新字符串(不要给它一个名字)。

在 Python 中,字符串是不可变的- 你对它们所做的任何事情都不能就地更改它们的内容,就像列表一样。必须使用创建新字符串的操作,并重新分配结果。此外,join方法用于获取整个字符串序列,并将它们连接在一起,例如:

' '.join(['a', 'b', 'c']) # produces 'a b c'

该代码不会引发错误,因为 Python 字符串也是一个有效的字符串序列(每个字符串由单个字符组成)。这是字符串的特殊行为,不被其他序列共享。

要在此处使用该方法,您需要生成'AB''A'片段的序列,只需调用''.join(即,我们在每个片段之间放置一个空字符串)即可直接获得结果。我们可以使用生成器表达式来做到这一点。它看起来像这样:

def process_string(oldstr):
return ''.join(
'AB' if char == 'A' else 'A'
for char in oldstr
)

(请注意函数的命名约定 - 有关 Python 中的标准样式约定,请参阅 PEP 8)

这就是你真正需要的。或者,您可以应用原始代码中想到的 += 逻辑,一次构建一段字符串(效率较低):

def process_string(oldstr):
newstr = ''
for char in oldstr:
newstr += 'AB' if char == 'A' else 'A'
return newstr # parentheses are meaningless here.

或者,您可以使用字符串类已经提供的对这种字符串翻译的内置支持(但这比应有的更尴尬):

def process_string(oldstr):
return oldstr.translate(str.maketrans({'A': 'AB', 'B': 'A'}))

在这里,str.maketrans调用属于字符串类的类方法(名为str,从启动时自动用作全局)。您可以在语言文档中阅读这些方法:str.translate;str.maketrans.

看来你感到困惑并试图做这两件事。尝试将转换规则的逻辑放入单独的函数(applyrules)中,但该函数只需要返回对应于单个输入字符的片段。(毕竟,您已经设置为循环访问字符,并将applyrules设计为一次接受一个字符。它所做的工作非常简单,至少目前没有必要使用单独的函数(除非它可以帮助您理解代码)。

在上面的例子中,我使用了一个三元条件运算符来表示为每个输入字符选择替换片段的逻辑。这对于生成器表达式方法是必需的,因为您正在编写单个表达式并且无处放置if:/else:块。

相关内容

  • 没有找到相关文章

最新更新