gpt4 book ai didi

python - 为什么此 L-System 代码不返回字符串?

转载 作者:行者123 更新时间:2023-12-01 07:35:13 26 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序接受一个字符串并用其他字符串替换某些字符。在这种情况下,(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 放在 'AB' 的每个字符之间来创建一个新字符串,然后扔掉这个新字符串(不要给它命名)。”

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

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

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

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

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

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

这确实是您所需要的。 或者您可以应用您在原始代码中想到的 += 逻辑,一次构建一个字符串(此 is less efficient ):

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并且从启动时自 Action 为全局可用)。您可以在语言文档中阅读有关这些方法的信息:str.translate ; str.maketrans .

看来您很困惑并尝试同时做这两件事。感谢尝试将转换规则的逻辑放入单独的函数 (applyrules),但该函数需要返回仅对应于单个输入字符的片段。 (毕竟,您已经设置了迭代字符,并将 applyrules 设计为一次接受一个字符。)它所做的工作非常简单 - 至少现在 -单独的函数并不是真正必要的(除非它可以帮助您理解代码)。

在上面的示例中,我使用了 ternary conditional operator表示为每个输入字符选择替换片段的逻辑。这对于生成器表达式方法是必要的,因为您正在编写一个表达式,并且没有地方放置 if:/else: block 。

关于python - 为什么此 L-System 代码不返回字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57018991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com