簡體   English   中英

為什么這個 L 系統代碼不返回字符串?

[英]Why Isn't This L-System Code Returning a String?

我正在嘗試編寫一個程序,該程序接受一個字符串並用其他字符串替換某些字符。 (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是一個空字符串;現在通過將現有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.

或者你可以使用 string 類已經提供的對這種字符串翻譯的內置支持(但這比它應該的更尷尬):

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

在這里, str.maketrans調用屬於字符串類的類方法(命名為str並且從啟動時自動作為全局可用)。 您可以在語言文檔中了解這些方法: str.translate str.maketrans

看來您感到困惑並試圖同時做這兩件事。 感謝嘗試將轉換規則的邏輯放入單獨的函數 ( applyrules ),但該函數需要返回與單個輸入字符對應的片段 (畢竟,您已經設置了迭代字符,並設計了applyrules接受一個字符的applyrules 。)它所做的工作非常簡單 - 至少現在 - 一個單獨的函數並不是真正的必要的(除非它可以幫助您理解代碼)。

在上面的例子中,我使用了一個三元條件運算符來表示為每個輸入字符選擇替換片段的邏輯。 這對於生成器表達式方法是必要的,因為您正在編寫單個表達式並且無處放置if: / else:塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM