簡體   English   中英

試圖將 RLE 轉換為 ASCII 但不允許我轉換多於一行

[英]Trying to convert RLE to ASCII but will not allow me to convert more than one line

我正在嘗試編寫一個函數,該函數允許我將用戶以'01h01e02l01o'形式輸入的RLE轉換為ASCII 'hello' 用戶需要分別輸入每一行,雖然我的代碼讓我輸入第一行,但會出現錯誤消息。

def enterRLE():
    print ('\n' + 'You have selected option 1: Enter RLE')
    lineNo = 0
    lineNoList = []
    RLEList = []
    while lineNo <= 2:
        lineNo = int(input('How many lines of RLE would you like to input? Please enter a number over 2.   '))
    for i in range(lineNo):
        RLEData = input('\n' + "Please enter one line of RLE and press enter. Enter your code with two digits, for example '07c' or '40a'.   ")
        RLEList.append(RLEData)
        RLELength = len(RLEList)
        for i in range(RLELength):
            n = 3
            RLEData = [RLEData[i:i+n] for i in range(0, len(RLEData), n)]
            for i in (RLEData):
                numOfChar = int(i[0:2])
                numOfChar = ((i[2:3])*numOfChar)
                print(numOfChar, end = "")

如果我將第二行輸入為“01h01a02l01w01a01y”,則輸出應為“走廊”,然后它應詢問我的第三行,但是,輸出為“走廊”,然后顯示以下顯示錯誤:

File "rleConverter.py", line 16, in enterRLE
    numOfChar = int(i[0:2])
TypeError: int() argument must be a string or a number, not 'list'

這個問題實際上不是關於 RLE,而是關於基本的編程知識/經驗。 所以我會根據你問題中的代碼給你一些建議。

當代碼沒有按預期工作時該怎么辦

當您的代碼未按預期工作時,請先嘗試對其進行調試。 做這件事有很多種方法:

  • 使用調試器逐步執行您的代碼。
  • 添加一些(臨時)打印語句。 例如,在每個循環中打印一條簡短的調試消息和i的值以了解發生了什么。

使用這些方法中的任何一種,您都可能會在代碼中發現錯誤。

如何改進你的代碼(這樣你就不必調試了)

代碼的最大問題與命名內容(主要是變量)有關。 考慮要存儲哪些變量,並適當地命名它們。 在閱讀代碼時,應該很容易從變量名中“猜測”出變量的實際含義。

  • 不要多次使用具有不同含義的相同變量名(在您的代碼中,變量i被多次使用,這會導致問題)。
  • 不要創建/定義您不使用的變量。 它們只會引起混亂。 (例如,您代碼中的變量lineNoList已分配但從未使用過。)
  • 遵循Python 命名約定,使您的代碼更加 Pythonic,並使其他 Python 程序員更容易閱讀。
  • 使用pep8 工具檢查您的代碼是否符合標准命名約定。
  • 學習基本的 Python 語言特性。 例如,在許多情況下for i in range(...)構造不是必需的,但可以用更簡單、更 Pythonic 的代碼替換(例如, for line in lines: ... ,其中lines是列表、元組或其他迭代器,或for line in file: ... ,其中file是一個打開的文件)。 這更易於閱讀並減少了您必須定義的變量數量。
  • 通過編寫更短的函數,您還可以減少作用域中(即函數內部)變量的數量,從而降低代碼復雜性,從而減少出錯的機會。

此外,在編程時使用pylint檢查代碼。 它會給你有價值的反饋。 在這種情況下,它會為您的代碼的第 12 和 15 行報告以下消息:

從外部范圍重新定義名稱“i”(第 8 行)

因此,使用 pylint,您會在運行代碼之前就已經發現了此錯誤 :-)

例如,以下是您的代碼的修改版本,它可以正常工作:

def decode_rle(line):
    parts = [line[i:i+3] for i in range(0, len(line), 3)]
    for part in parts:
        length = int(part[0:2])
        character = part[2]
        print(length * character, end='')


def enter_rle():
    print('\nYou have selected option 1: Enter RLE')
    num_lines = 0
    while num_lines <= 2:
        num_lines = int(input('How many lines of RLE would you like to input? Please enter a number over 2.   '))
    for _ in range(num_lines):
        line = input("\nPlease enter one line of RLE and press enter. Enter your code with two digits, for example '07c' or '40a'.   ")
        decode_rle(line)


if __name__ == '__main__':
    enter_rle()

暫無
暫無

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

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