1

我正在尝试编写一个程序,该程序接受一个字符串并用其他字符串替换某些字符。(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”,但是没有任何东西返回到控制台。为什么是这样?提前致谢!- 伊莱

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

4

1 回答 1

1

例如,您似乎期望

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
    )

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

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

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

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

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

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

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

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

于 2019-07-13T12:38:34.550 回答